views:

42

answers:

1

Whenever I install a new font on a Windows 2003 server, I can't use it immediately in my asp.net web application. The application gets the font through the CreateFontIndirect gdi32.dll win api, and then use this font to create a dynamic text image in my asp.net application. It seems like fonts get cached somewhere, because I will just get the default font returned.

The font cache gets updated after a reboot, and then I get the correct font, but obviously I wouldn't like to do a reboot on a production server just for getting a new font to work.

Is there a way to flush the font cache?

+1  A: 

By default, when you install a new font, only the current session is notified of the change. So if you're logging into the server in a terminal services session (which seems likely) then the ASP.NET application (which will be running in a different session) will not see the change.

When you reboot, the system automatically scans the font directory and "registers" all of the fonts in there into the current session.

To "manually" register a new font, you will need to call AddFontResource and pass in the path to the font.

To make it slightly easier, you could make it so that your app scans the Fonts folder and calls AddFontResource on each file it finds there in it's Application_Start event. That way, when you install a new font, you can just recycle the site (e.g. edit the web.config file) and it'll re-scan all of the files.

Another option would be to put a directory watch (via FileSystemWatcher) on the Fonts folder and automatically re-scan it.

I guess it just depends how often you'll be installing new fonts...

Dean Harding
So there is no possibility to rescan the fonts from outside the application for that particular session?
Jappie
`AddFontResource` adds the font to the system for the *whole* session, so you could run another program in same session as ASP.NET to re-scan the directory and call `AddFontResource`, but whether there'd be much benefit I'm not so sure.
Dean Harding
Ok thanks, I'll just reboot the server this time.
Jappie