2010-06-03 15 views
12

Ogni volta che installo un nuovo font su un server Windows 2003, non posso utilizzarlo immediatamente nella mia applicazione web asp.net. L'applicazione ottiene il carattere attraverso l'API di vittoria gdi32.dll CreateFontIndirect e quindi utilizza questo carattere per creare un'immagine di testo dinamica nella mia applicazione asp.net. Sembra che i caratteri vengano memorizzati nella cache da qualche parte, perché restituirò il carattere predefinito.I caratteri di Windows non sono immediatamente utilizzabili nell'applicazione dopo l'installazione?

La cache dei caratteri viene aggiornata dopo un riavvio, quindi viene visualizzato il carattere corretto, ma ovviamente non vorrei eseguire un riavvio su un server di produzione solo per far funzionare un nuovo font.

C'è un modo per svuotare la cache dei font?

+0

Come installate i caratteri? –

+0

Li installo copiandoli nella cartella windows \ fonts. Windows mostra la barra di installazione prgress e appaiono correttamente nella cartella windows \ fonts in modo che sembrino installati correttamente. – Carvellis

+0

btw sono normali caratteri TT che normalmente funzionano nell'applicazione, non immediatamente dopo averli installati in Windows. – Carvellis

risposta

12

Per impostazione predefinita, quando si installa un nuovo font, viene notificata solo la sessione corrente corrente. Quindi, se si sta effettuando l'accesso al server in una sessione di servizi terminal (che sembra probabile), l'applicazione ASP.NET (che verrà eseguita in una sessione diversa) non vedrà la modifica.

Al riavvio, il sistema esegue automaticamente la scansione della directory dei caratteri e "registra" tutti i font presenti nella sessione corrente.

Per "manualmente" registrare un nuovo carattere, è necessario chiamare AddFontResource e passare il percorso al carattere.

Per semplificare leggermente, è possibile farlo in modo che l'app esegua la scansione della cartella Fonts e chiami AddFontResource su ogni file rilevato nell'evento Application_Start. In questo modo, quando installi un nuovo font, puoi semplicemente riciclare il sito (ad esempio modificare il file web.config) e riesaminerà tutti i file.

Un'altra opzione sarebbe quella di mettere una directory watch (tramite FileSystemWatcher) nella cartella Fonts e scansionarla automaticamente.

Credo che dipende solo da quanto spesso ti verrà installando nuovi font ...

+1

Quindi non esiste la possibilità di eseguire nuovamente la scansione dei caratteri dall'esterno dell'applicazione per quella particolare sessione? – Carvellis

+0

'AddFontResource' aggiunge il carattere al sistema per la * intera * sessione, quindi è possibile eseguire un altro programma nella stessa sessione di ASP.NET per rieseguire la scansione della directory e chiamare' AddFontResource', ma se ci sarebbe molto beneficio Non sono così sicuro. –

+0

Ok grazie, riavvierò il server questa volta. – Carvellis

1

Riavvia IIS. quello dovrebbe fare il trucco. sfogliare iisreset dalla riga di comando o utilizzare il gestore IIS.

+2

Posso confermare che questo non funziona La spiegazione di Dean sembra essere corretta. – Heinzi

+1

Questo ha funzionato per la mia applicazione di codice a barre senza un riavvio del sistema utilizzando System.Drawing.Font per creare un'immagine dal carattere del codice a barre. – Crob

+0

questa risposta potrebbe risolvere il tuo problema, fare un tentativo, ha risolto il mio. –