Comment supprimer le fichier d’un PrivateFontCollection.AddFontFile?

Nous créons un grand nombre de fonts pour une utilisation courte. Les fonts sont incorporées dans les documents. Je veux supprimer les fichiers de police si ne plus utiliser. Comment peut-on le faire? Le code simplifié suivant ne fonctionne pas:

PrivateFontCollection pfc = new PrivateFontCollection(); pfc.AddFontFile(fontFile); FontFamily family = pfc.Families[0]; Console.WriteLine(family.GetName(0)); family.Dispose(); pfc.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); File.Delete(fontFile); 

La suppression du fichier échoue car le fichier est verrouillé. Que puis-je faire d’autre pour libérer le verrou de fichier?

PS: Avant d’utiliser AddMemoryFont. Cela fonctionne avec Windows 7. Mais avec Windows 8 .NET, utilisez les mauvais fichiers de fonts après la première mise au rebut de FontFamily. Étant donné que chaque document peut contenir d’autres fonts, nous avons besoin d’un très grand nombre de fonts et ne pouvons pas contenir de références à toutes.

Après avoir cherché dans le code de la méthode AddFontFile:

 public void AddFontFile(ssortingng filename) { IntSecurity.DemandReadFileIO(filename); int num = SafeNativeMethods.Gdip.GdipPrivateAddFontFile(new HandleRef(this, this.nativeFontCollection), filename); if (num != 0) { throw SafeNativeMethods.Gdip.StatusException(num); } SafeNativeMethods.AddFontFile(filename); } 

on voit que la police est enregistrée 2 fois. D’abord en GDI + et à la dernière ligne en GDI32. Ceci est différent de la méthode AddMemoryFont. Dans la méthode Dispose, il est uniquement désenregistré dans GDI +. Cela entraîne une fuite dans GDI32.

Pour compenser cela, vous pouvez appeler le suivant:

 [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int RemoveFontResourceEx(ssortingng lpszFilename, int fl, IntPtr pdv); pfc.AddFontFile(fontFile); RemoveFontResourceEx(tempFile, 16, IntPtr.Zero);