gpt4 book ai didi

asp.net - .NET PrivateFontCollection - 完成后如何释放文件锁

转载 作者:行者123 更新时间:2023-12-01 23:36:42 24 4
gpt4 key购买 nike

我有一个返回 PrivateFontCollection 的函数:

Public Shared Function GetCustomFonts() As PrivateFontCollection
Dim result = New PrivateFontCollection

Dim customFontFiles = {"Garamond.TTF", "Garamond-Bold.TTF", "Garamond-Italic.TTF", "EurostileExtended-Roman-DTC.TTF"}

For Each fontFile In customFontFiles
result.AddFontFile(Hosting.HostingEnvironment.MapPath("/Includes/" & fontFile))
Next

Return result
End Function

然后我按如下方式使用该函数:

Using customFonts = Common.GetCustomFonts()
' Do some stuff here
End Using

我希望这些文件会被释放,但它们仍然被锁定:我收到以下错误:“操作无法完成,因为文件已在系统中打开”。关闭文件并重试。'

关闭 IIS 中的网站没有帮助;我们必须回收应用程序池才能释放它。

任何人都可以建议如何使用 PrivateFontCollection 以便在使用之间释放文件吗?

最佳答案

作为解决方法,我将字体加载到内存中并使用“AddMemoryFont”代替。请参阅下面的代码。请记住,这是我第一次接触 .NET 中的非托管资源,因此我不能保证下面的内存管理没问题。

Imports System.Drawing.Text
Imports System.Runtime.InteropServices

Public Class CustomFontService
Implements IDisposable

Dim _fontBuffers As List(Of IntPtr)
Dim _collection As PrivateFontCollection

Public Sub New()
_collection = New PrivateFontCollection
_fontBuffers = New List(Of IntPtr)

Dim customFontFiles = {"Garamond.TTF", "Garamond-Bold.TTF", "Garamond-Italic.TTF", "EurostileExtended-Roman-DTC.TTF"}

For Each fontFile In customFontFiles
Dim fontBytes = System.IO.File.ReadAllBytes(Hosting.HostingEnvironment.MapPath("/Includes/" & fontFile))

Dim fontBuffer As IntPtr = Marshal.AllocHGlobal(fontBytes.Length)
Marshal.Copy(fontBytes, 0, fontBuffer, fontBytes.Length)

_fontBuffers.Add(fontBuffer)

_collection.AddMemoryFont(fontBuffer, fontBytes.Length)
Next
End Sub

Public Function GetCustomFonts() As PrivateFontCollection
Return _collection
End Function

#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls

' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If

For Each buf In _fontBuffers
If (buf <> IntPtr.Zero) Then
Marshal.FreeHGlobal(buf)
End If
Next

' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub

' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
Protected Overrides Sub Finalize()
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(False)
MyBase.Finalize()
End Sub

' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region

End Class

关于asp.net - .NET PrivateFontCollection - 完成后如何释放文件锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26642136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com