C#引用C++ Dll檔案遇到問題總結
背景
在使用C#開發時,不可避免的需要引用C++封裝的Dll庫。在此過程中,遇到了一些問題,在這裡做個總結。
問題及解決
問題1
問題描述:執行時遇到了錯誤。此錯誤的地址為 0x5f6996b5,線上程 0x1f68 上。錯誤程式碼為 0xc0000005。此錯誤可能是 CLR 中的 bug,或者是使用者程式碼的不安全部分或不可驗證部分中的 bug。此 bug 的常見來源包括使用者對 COM-interop 或 PInvoke 的封送處理錯誤,這些錯誤可能會損壞堆疊。
原因及解決方案:一般是C#與C++引數變數轉換不正確導致的。建議搜一搜C++與C#引數變數對應關係,確認兩者轉換關係是否正確
案例:
[DllImport("LibFT260.dll")]
public static extern FT260_STATUS FT260_UART_Read(IntPtr ft260Handle, byte[] lpBuffer, UInt32 dwBufferLength, UInt32 dwBytesToRead, ref UInt32 lpdwBytesReturned);
紅色字型部分C++的函式引數為LPVOID*,我之前轉換為了 ref byte[] lpBuffer,導致該異常發生。
問題2
問題描述:找不到函式入口點
原因及解決方案:C++dll封裝後,函式名稱出現亂碼。如果沒有dll檔案原始碼,可利用
案例:
通過DLL Anlayzer工具轉換
[DllImport("LibFT260.dll", EntryPoint = "[email protected]", CallingConvention = CallingConvention.Cdecl)]
public static extern FT260_STATUS FT260_UART_SetBaudRate(IntPtr ft260Handle, UInt64 baudRate)
將DLL Anlayzer工具轉換出的函式名稱引用,直接解決此問題。
問題3
原因及解決方案:該片記憶體可能正在讀寫,獲取返回資訊時,新增延時就沒有出現該問題了