您当前的位置: 首页 >  .net

phymat.nico

暂无认证

  • 3浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

phymat.nico 发布时间:2020-05-27 14:14:53 ,浏览量:3

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

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0471s