C#.net调用动态库dll注意事项
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);
?就出現錯誤“嘗試讀取或寫入受保護的內存。這通常指示其他內存已損壞 ”。
?
解決方法是將byte[]改為IntPtr即可,如:
?
[DllImport("OUR_IDR.dll")]
public?static?extern?IntPtr?idr_read(IntPtr?pserial);
?
?在調用時:
?
IntPtr?cardId?=?new?IntPtr();
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
?
https://www.cnblogs.com/samlin/archive/2012/03/23/DllImport.html
https://blog.csdn.net/jianhui_wang/article/details/82657595
總結
以上是生活随笔為你收集整理的C#.net调用动态库dll注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下安装MySQL压缩zip
- 下一篇: 北斗部标808协议解析说明示例