1. 程式人生 > >C#引用C++ Dll檔案遇到問題總結

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工具轉換,然後在引用時標記函式入口點EntryPoint =“工具轉換的函式名稱”。

案例: 

通過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

原因及解決方案:該片記憶體可能正在讀寫,獲取返回資訊時,新增延時就沒有出現該問題了