zoukankan      html  css  js  c++  java
  • 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
    转载请注明出处[http://samlin.cnblogs.com/

    欢迎关注本人公众号:

    作者赞赏
  • 相关阅读:
    周4早上搜索引擎分析 crmim.com| MSCRM开发者之家
    Bat命令学习
    sqlserver日期函数
    ubunto应用软件
    sql for xml
    win7x64 连接oracle 客户端 vs 2010调试 提示“ORA12154: TNS: 无法解析指定的连接标识符 ”ORA06413 问题(转)
    CentOS Rsync服务端与Windows cwRsync客户端实现数据同步
    怎么引导2岁孩子洗手问题
    Libnfcinstallation
    Asterisk资料
  • 原文地址:https://www.cnblogs.com/samlin/p/DllImport.html
Copyright © 2011-2022 走看看