• C#引用C++开发的DLL


    C#引用C++开发的DLL

    .Net 开发中如果使用外部DLL,一般引用进来就可以了,最多引用前将DLL注册一下。最近做的项目中需要使用硬件厂家用C++开发的DLL,我还照原来的方式引用却报错,一步步用下来却发现原来还有这么多技巧需注意。下面是我所遇到的问题及解决的方法,希望能对大家有用。

    1.在Visual Studio中引用C++写的DLL时报以下错误:

    未能添加引用,请确保此文件可访问并且是一个有效的程序集或COM组件。

    手工注册该DLL也报错:模块已加载,但找不到入口点DLLRegisterServer, 请确保XXX为有效的DLL或OCA文件,然后重试。

    经查询发现C++编译的DLL并不一定能被C#直接使用,需通过C#中的DllImport直接调用这些功能。

    代码如下所示:

    在程序开始时使用以下语句注册方法。

     [DllImport("Enc7481.dll", EntryPoint = "_Enc7481_Set_Encoder", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
     private extern static void _Enc7481_Set_Encoder(UInt16 intDirection, Int32 lngValue);

    在程序中直接调用就可以了:

    _Enc7481_Set_Encoder(0, 0);

    2.找不到对应的方法

    使用以上的程序后,参考厂商所给的C++程序却报找不到对应的入口点,也就是函数名称不对。C++DLL编译后函数名称会有变化,需使用eXeScope.exe查询具体的函数名称。

    3.报内存错误:

    尝试读取或写入受保护的内存。这通常指示其他内存已损坏。造成这种错误的情况很多,一般来说是对函数的使用错误造成的。对于我的程序来说是因为需要首先调用_Enc7481_Init()来初始化。

    4.类型错误

    终于将以上错误都解决,程序可以运行了,但发现取到的数据总是不对,再次检查,发现原来是数据类型不对造成的。

    VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等
    但转为C#类型却不完全相同,只有数据类型对应正确才能取得正确的数据。

    类型对照:

    BSTR ---------  StringBuilder

    LPCTSTR --------- StringBuilder

    LPCWSTR ---------  IntPtr

    handle---------IntPtr

    hwnd-----------IntPtr

    char *----------string

    int * -----------ref int

    int &-----------ref int

    void *----------IntPtr

    unsigned char *-----ref byte

    5.结构体参数的传递

    对于结构体参数需要在C#中建立对应的结构体,并用Marshal类将结构体转换为指针地址传给C++函数,取得数据后再根据指针地址取得对应的结构。

    HREE structThree = new THREE();
                IntPtr ptrThree = Marshal.AllocHGlobal(Marshal.SizeOf(structThree));
                Marshal.StructureToPtr(structThree, ptrThree, false);
                _Enc7481_Get_ThreeEncoder2(ptrThree);
                structThree = (THREE)Marshal.PtrToStructure(ptrThree, typeof(THREE));

     
     
    分类: ASP.NET
  • 相关阅读:
    python 三行代码实现快速排序
    kafka使用自带zookeeper 单机版安装、配置、启动、生产消费消息测试
    kafka manager添加集群出现错误KeeperErrorCode
    常用的kubectl命令
    20210531-20210606 助教一周小结(第十八周)
    20210524-20210530 助教一周小结(第十七周)
    20210517-20210523 助教一周小结(第十六周)
    20210510-20210516 助教一周小结(第十五周)
    20210503-20210509 助教一周小结(第十四周)
    20210426-20210502 助教一周小结(第十三周)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2999997.html
Copyright © 2020-2023  润新知