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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值