C#.net調用動態庫dll注意事項
本文主要描述作者在工作中所遇到技術難點及問題,最后提出相關的解決方案
場景
公司有個業務需求涉及到ID讀卡器,構建成在ID卡讀卡器一刷ID卡,系統就自動顯示其ID卡號以及該ID卡的基本信息和消費的記錄等信息;
問題
在選購相關的ID讀卡器產品后,下載其開發包其中包含了用C++語言開發的動態庫DLL,在調用時出現以下問題:
1、無法加載 DLL“OUR_IDR.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。
2、嘗試讀取或寫入受保護的內存。這通常指示其他內存已損壞
解決方案
1、第一個問題“無法加載 DLL“OUR_IDR.dll”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。”,解決很簡單,具體方法是將 dll復制到應用程序中的bin目錄即可。
2、
我在調用以下代碼時:
[DllImport(
"
OUR_IDR.dll
")]
public static extern byte[] idr_read( byte[] pserial);
public static extern byte[] idr_read( byte[] pserial);
就出現錯誤“嘗試讀取或寫入受保護的內存。這通常指示其他內存已損壞 ”。
解決方法是將byte[]改為IntPtr即可,如:
[DllImport(
"
OUR_IDR.dll
")]
public static extern IntPtr idr_read(IntPtr pserial);
public static extern IntPtr idr_read(IntPtr pserial);
在調用時:
IntPtr cardId =
new IntPtr();
IntPtr result = Module.idr_read(cardId);
IntPtr result = Module.idr_read(cardId);
即可;
C#在調用C++動態庫DLL時,注意數據類型轉換
C# 與 C++ 數據類型對照
C++ C#
=====================================
WORD ushort
DWORD uint
UCHAR int/byte 大部分情況都可以使用int代替,而如果需要嚴格對齊的話則應該用bytebyte
UCHAR* string/IntPtr
unsigned char* [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
char* string
LPCTSTR string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)] string
long int
ulong uint
Handle IntPtr
HWND IntPtr
void* IntPtr
int int
int* ref int
*int IntPtr
unsigned int uint
COLORREF uint
C++ C#
=====================================
WORD ushort
DWORD uint
UCHAR int/byte 大部分情況都可以使用int代替,而如果需要嚴格對齊的話則應該用bytebyte
UCHAR* string/IntPtr
unsigned char* [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
char* string
LPCTSTR string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)] string
long int
ulong uint
Handle IntPtr
HWND IntPtr
void* IntPtr
int int
int* ref int
*int IntPtr
unsigned int uint
COLORREF uint
