我有一個C#項目,我使用了幾個非託管C++函數。 更確切地說,我還有靜態的IntPtr,我用它們作爲這些函數的參數。我知道,無論何時使用它們,我都應該在該類中實現IDisposable,並使用析構函數調用Dispose方法,在那裏釋放使用的IntPtr,如MSDN頁面中所述。如何在應用程序關閉時處理釋放非託管結構?
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
// Check to see if Dispose has already been called.
if (!this.disposed)
{
if (disposing)
{
component.Dispose();
}
CloseHandle(m_InstanceHandle);
m_InstanceHandle = IntPtr.Zero;
disposed = true;
}
}
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
但是,當我終止應用程序時,我仍然留在TaskManager中掛起的進程。我認爲,它必須與我的結構中使用的指令的MarshalAs的:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SipxAudioCodec
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string CodecName;
public SipxAudioBandwidth Bandwidth;
public int PayloadType;
}
當我創建這樣一個結構,我應該也小心地釋放它的空間使用allocs析構函數?
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SipxAudioCodec
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string CodecName;
public SipxAudioBandwidth Bandwidth;
public int PayloadType;
~SipxAudioCodec()
{
Marshal.FreeGlobal(something...);
}
}
您確定您的Dispose方法實際上是在應用程序關閉時調用的嗎? – MusiGenesis 2010-05-14 19:12:08