У меня возникла эта проблема при использовании компонента COM AcrobarReader. Время от времени после выхода из приложения у меня появлялось «Application.vshost.exe - Ошибка приложения», «память не читалась». GC.Collect () и WaitForPendingFinalizers () не помогли.
Мой гугл-фу привел меня на эту страницу: http://support.microsoft.com/kb/826220. Я изменил метод 3 для моего случая.
Используя Process Explorer, я обнаружил, что AcroPDF.dll не выпускается до последней строки в функции Main. Итак, вот и вызовы API.
DLLImports (DLLImport находится в пространстве имен System.Runtime.InteropServices):
<DllImport("kernel32.dll", EntryPoint:="GetModuleHandle", _
SetLastError:=True, CharSet:=CharSet.Auto, _
CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function GetModuleHandle(ByVal sLibName As String) As IntPtr
End Function
<DllImport("kernel32.dll", EntryPoint:="FreeLibrary", _
SetLastError:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Overloads Shared Function FreeLibrary(ByVal hMod As IntPtr) As Integer
End Function
А затем перед выходом из приложения:
Dim hOwcHandle As IntPtr = GetModuleHandle("AcroPDF.dll")
If Not hOwcHandle.Equals(IntPtr.Zero) Then
FreeLibrary(hOwcHandle)
Debug.WriteLine("AcroPDF.dll freed")
End If
Эта процедура может быть изменена для любого другого дурного поведения dll. Я просто надеюсь, что это не внесет никаких новых ошибок.