C#调用C++ DLL的完整方法(解决了各种坑,Win7下测试可用)

        由于C#直接访问USB设备的能力较弱,而C++在这方面则强大许多。因此,考虑通过C++实现读写USB设备,C#调用该DLL接口的方式。这个过程中,上网查了一些资料,但是自己动手,仍然会出现这样或者那样的问题,因此,记录下大体步骤,以便后续他人或者自己可以参考。

        主要步骤如下:

        1 C++ dll声明导出函数,代码如下(注意不同语言之间由于函数调用方式不一致,这里一定要添加 __stdcall):

extern "C" DLL_API int __stdcall Fun1(int type)
{
	return 1;
}
extern "C" DLL_API int __stdcall Fun2()
{
	return 2;
}

extern "C" DLL_API int __stdcall Fun3(WCHAR* serialNO)
{
	wcscpy(serialNO,L"1234656-245奥迪");
	return 3;
}

         2 C++ Dll 编写模块定义文件,使得函数名称不会因为C++的函数名称修饰而改变导致找不到函数

LIBRARY Test.Dll

EXPORTS
        Fun1
	Fun2
	Fun3
      3 C++ Dll 工程配置使用def模块定义文件。右键 项目属性-->链接器-->模块定义文件 输入模块定义文件的名称即可。然后编译生成Dll。

         

          4 C# 增加调用声明,类似如下:

    public class TEST_DLL_API
    {
        [DllImport("Test.dll", EntryPoint = "Fun1")]
        public static extern int Fun1();

        [DllImport("Test.dll", EntryPoint = "Fun1")]
        public static extern int Fun2();

        [DllImport("Test.dll", EntryPoint = "Fun1")]
        public static extern int Fun3(byte[] str);
    }
         

          5  如果报DllImport找不到的类似错误,增加 using System.Runtime.InteropServices; 即可解决该问题。


          6  调用C#声明C++中的接口,代码如下(注意C++ WCHAR* 与C# 中 string之间的转换方法):

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] serialNo = new byte[64];
            int result = 0;

            result = TEST_DLL_API.Fun1();
            result = TEST_DLL_API.Fun3(serialNo);
            result = TEST_DLL_API.Fun2();

            string str = Encoding.Unicode.GetString(serialNo); 
        }

           7 运行测试,win7 32位程序应该能够直接成功(把Test.Dll文件拷贝到C#工程bin目录下对应的Debug目录下 bin\Debug)。我是在win7 64位程序调试C#程序,会报 C#调用dll提示"试图加载格式不正确的程序"的错误,解决方法如下:
             点击项目属性,生成 属性页,把目标平台Any CPU 设置为 x86 即可( bin\x86\Debug 目录)。

             接着把 Test.Dll 文件拷贝到C#工程bin目录下对应的Debug目录下。再次调试运行即大功告成。


          8 当然了问题7有更好的解决办法。对于64位系统下调用C++的Dll,可以不设置CPU为x86,我们编译64位的C++ Dll,然后C#使用64位的Dll即可以调试运行


           如果各位在使用过程有其它问题,欢迎讨论。。。

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值