您的位置:首页 > 编程语言 > C#

C#.net调用动态库dll注意事项

2012-03-23 13:15 253 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: