我正在處理一個需要實現非託管Windows DLL的項目。該DLL用於與USB設備進行通信。我的代碼是在C#和WPF中。 要初始化我叫一個叫函數的DLL:從C#WPF應用程序調用非託管Windows DLL時出錯
InitTimerDll(Int32 wHandle, ref dllInitParams initParams);
當調用這個函數我必須通過結構稱爲dllInitParams與該控件綁定到句柄。 我使用的DllImport爲函數指針爲這樣:
[DllImport("myDll.dll")]
public static extern void InitTimerDll(Int32 wHandle, ref dllInitParams initParams);
這裏是我的結構:
public struct dllInitParams
{
public UInt16 simp;
public UInt16 simt;
}
以上所有的都在一個單獨的類名爲myDllInterface.cs。下面是我如何調用InitTimerDll功能從我的WPF形式:
public IntPtr Handle
{
get { return (new System.Windows.Interop.WindowInteropHelper(this)).Handle; }
}
private void initTime_Click(object sender, RoutedEventArgs e)
{
myDllInterface.dllInitParams initParams = new myDllInterface.dllInitParams();
initParams.simp = 0;
myDllInterface.InitTimerDll(this.Handle.ToInt32(), ref initParams);
}
上面的代碼中的第一部分解釋我是怎麼把手和initTime_Click顯示瞭如何初始化結構,通過將調用initTimeDll功能處理和它的結構。我已經將dll文件複製到運行代碼的目錄中。我的代碼編譯得很好,但是當我單擊initTime按鈕時它會創建一個錯誤。 錯誤:
An unhandled exception of type 'System.AccessViolationException' occurred in ProbeCTRL.exe
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
爲什麼會發生這種情況?
很難說,崩潰的代碼不是您發佈的代碼。您需要調試本機代碼。項目+屬性,調試選項卡,勾選「啓用非託管代碼調試」。在C或C++源代碼中的InitTimerDll函數上設置一個斷點。 –
對於句柄值使用「Int32」而不是「IntPtr」可能會在64位操作系統中導致問題。也可能你的調用約定是錯誤的(.NET中的默認是StdCall)。 – vcsjones