• 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/

    欢迎关注本人公众号:

    作者赞赏
  • 相关阅读:
    Object转bigdecimal
    如何在A用户下建立视图,这个视图是A的表与B的表进行关联的?
    java.util.Date和java.sql.Date的区别和相互转化(转)
    JAVA如何获取GUID
    详解Oracle DELETE和TRUNCATE 的区别(摘)
    分开显示Excel2010打开的文档
    CentOS实验三:使用安装光盘建立本地软件源
    基本C库函数
    Shell_2(验证符合的输入)
    Shell_1(目录之间切换执行脚本)
  • 原文地址:https://www.cnblogs.com/samlin/p/DllImport.html
Copyright © 2020-2023  润新知