C++ 与 C# 互掉

http://jingyan.baidu.com/article/c275f6ba237b4de33d75678b.html 

 C#又称为C++++,C#调用C语言或者C++一般比较的容易,但是C++调用C#,却要麻烦一些,现在网上也有很多关于这方面,但是大多数的资料,要么太旧了,要么太复杂,所以而且很多的都是C#调用C的代码,没有C++调用C#的代码的部分介绍;

     所以将C#和C++互掉的内容,综合性的发帖,既可以方便他人,亦可以方便自己将来再次的查看,一句话:

     方便他人亦是方便自己,如果觉得还行就点下右边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!

      测试代码的百度云链接:http://pan.baidu.com/s/1gdenett 密码:mlkx

工具/原料

  • Windows8.1 x64
  • Visual Studio 2015

创建C++ dll库

  1. 1

    新建一个 "cpp_and_cs"互掉的工程,如下图所示:

    C++ 与 C# 互掉
    C++ 与 C# 互掉
  2. 2

    ① 选择 DLL;

    ② 选择 空项目;

    ③ 点击 完成;

    具体的如下图所示:

  3. 3

    ① 添加一个 “cpp_dll.cpp”的源文件;

    ② 在源文件中添加如下的代码:

    extern "C" __declspec(dllexport) int __stdcall getValueFromCppDll(){ return 100;}

    C++ 与 C# 互掉
  4. 4

    编译后就可以看到生成的dll文件

    END

通过C#调用C++dll

  1. 1

    创建一个C# 控制台应用程序,具体的如下图所示:

    C++ 与 C# 互掉
  2. 2

    在C#中添加如下的代码:

    using System.Runtime.InteropServices;

     [DllImport("cpp_and_cs.dll")] private static extern int getValueFromCppDll();

    int nValue = getValueFromCppDll();System.Console.WriteLine(nValue);

  3. 3

    将c++生成的dll拷贝一份到C#对应的目录下面去,如下图所示

    C++ 与 C# 互掉
  4. 4

    将C#工程设置为启动项,使用快捷键

    Ctrl+F5 运行;

    C++ 与 C# 互掉
    C++ 与 C# 互掉
  5. 5

    至此C#调用C++就完成了,下面开始讲解c++调用C#

    END

创建一个C# com 组件

  1. 1

    创建一个c#的空项目,具体的如下图所示:

    C++ 与 C# 互掉
  2. 2

    给工程添加一个“CSDLL.cs” 组件,如下图所示:

    C++ 与 C# 互掉
    C++ 与 C# 互掉
  3. 3

    ① 给 cs_dll  工程添加一个接口 ICSDLL

    ② 在接口中添加如下方法名; getValueFromCsDll

    C++ 与 C# 互掉
    C++ 与 C# 互掉
  4. 4

    ① 右键 CSDLL.cs

    ② 查看代码

    ③ 在 CSDLL.cs 类型中添加方法 getValueFromCsDll

    具体的代码如下:

    public int getValueFromCsDll(){       return 200;

     }

    并且继承接口

     ICSDLL

    C++ 与 C# 互掉
  5. 5

    修改工程属性,编译的时候会报如下的错误:

    error MSB3216: 无法注册程序集“c:\users\fuke\documents\visual studio 2015\Projects\cpp_and_cs\cs_dll\bin\Debug\cs_dll.dll”- 拒绝访问。请确保您正在以管理员身份运行应用程序。对注册表项“HKEY_CLASSES_ROOT\cs_dll.CSDLL”的访问被拒绝。

  6. 6

    ① 以管理员的方式启动Visual Studio 2015

    ② 重新打开刚才的项目

    ③ 重新编译

    C++ 与 C# 互掉
  7. 7

    编译完后,可以发现多了 cs_dll.tlb 这个文件,至此C#的com组件便生成了

    END

C++调用 C# com

  1. 创建一个c++控制台应用程序,具体的流程如下:

    C++ 与 C# 互掉
    C++ 与 C# 互掉
    C++ 与 C# 互掉
  2. 将 "cs_dll.dll" 和 "cs_dll.tlb" 从:

    C:\Users\fuke\Documents\visual studio 2015\Projects\cpp_and_cs\cs_dll\bin\Debug

    拷贝一份到:

    C:\Users\fuke\Documents\Visual Studio 2015\Projects\cpp_and_cs\Debug

    具体的如下图所示:

  3. 创建一个文件:cpp_exe.cpp,代码如下:

    #import "..\cs_dll\bin\Debug\cs_dll.tlb"

    int  main(){ cs_dll::ICSDLLPtr pCs = NULL;;  try {  HRESULT hr = CoInitialize(NULL);  if (FAILED(hr))   _com_issue_error(hr);

      hr = pCs.CreateInstance(__uuidof(cs_dll::CSDLL));  if (FAILED(hr))   _com_issue_error(hr);

      int nValue = pCs->getValueFromCsDll();

      printf("nValue=[%d]\n", nValue);

     } catch (_com_error e) {  _bstr_t bstrMsg(e.Description());  char* szMsg = bstrMsg;  printf ("error: main failed, errinfo=[%s]\n", szMsg);

      return -1; }

     return 0;}

    运行后的效果如下:

    C++ 与 C# 互掉

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值