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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM