2014-10-31 4 views
4

짧은 사용을 위해 많은 수의 글꼴을 만듭니다. 글꼴은 문서에 포함되어 있습니다. 더 이상 사용하지 않으면 글꼴 파일을 삭제하고 싶습니다. 우리는 어떻게이 일을 할 수 있습니까? 다음의 간단한 코드는 작동하지 않습니다.PrivateFontCollection.AddFontFile 파일을 삭제하는 방법은 무엇입니까?

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); 

파일이 잠겨 있기 때문에 파일을 삭제할 수 없습니다. 파일 잠금을 해제하려면 어떻게해야합니까?

추 신 : AddMemoryFont를 사용하기 전에. Windows 7에서 작동합니다.하지만 Windows 8 .NET에서는 첫 번째 FontFamily가 Disposed 된 후 잘못된 글꼴 파일을 사용합니다. 모든 문서에는 다른 글꼴이 포함될 수 있으므로 매우 많은 수의 글꼴이 필요하며 모든 글꼴에 대한 참조를 가질 수 없습니다.

+1

추가 '16'그것에 대해 궁금해 사람들을 위해 버그 https://connect.microsoft.com/VisualStudio/feedback/details/1379843 – Peter

답변

8

방법 AddFontFile의 코드에서 찾고 후 :

public void AddFontFile(string 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); 
} 

우리는 글꼴이 2 번 등록되어있는 것을 알 수있다. GDI +의 첫 번째 줄과 GDI32의 마지막 줄 이것은 AddMemoryFont 메소드와 다릅니다. Dispose 메서드에서는 GDI +에서만 등록이 해제됩니다. GDI32 누수가 발생합니다. 그것의 :

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern int RemoveFontResourceEx(string lpszFilename, int fl, IntPtr pdv); 

pfc.AddFontFile(fontFile); 
RemoveFontResourceEx(tempFile, 16, IntPtr.Zero); 
+1

를 연결합니다

당신이 호출 할 수있는 후속이 보상을 FR_PRIVATE 플래그 –

+1

수정 사항을 적용하면 MS가이 버그를 수정하면 어떻게됩니까? – Peter

+1

@Peter 추가되지 않은 글꼴을 제거하면 아무 것도 없습니다. 당신이 2 번 전화하면 이것을 테스트 할 수 있습니다. 또는 AddFontFIle없이 호출합니다. – Horcrux7

관련 문제