C++ 与 C# 互掉

作者:彼岸花开 | 创建时间: 2023-07-01
C++ 与 C# 互掉

创建C++ dll库

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

① 选择 DLL; ② 选择 空项目; ③ 点击 完成; 具体的如下图所示:

① 添加一个 “cpp_dll.cpp”的源文件; ② 在源文件中添加如下的代码: extern "C" __declspec(dllexport) int __stdcall getValueFromCppDll(){ return 100;}

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

通过C#调用C++dll

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

在C#中添加如下的代码: using System.Runtime.InteropServices; [DllImport("cpp_and_cs.dll")] private static extern int getValueFromCppDll(); int nValue = getValueFromCppDll();System.Console.WriteLine(nValue);

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

将C#工程设置为启动项,使用快捷键 Ctrl+F5 运行;

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

创建一个C# com 组件

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

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

① 给 cs_dll  工程添加一个接口 ICSDLL ② 在接口中添加如下方法名; getValueFromCsDll

① 右键 CSDLL.cs ② 查看代码 ③ 在 CSDLL.cs 类型中添加方法 getValueFromCsDll 具体的代码如下: public int getValueFromCsDll(){       return 200; } 并且继承接口 ICSDLL

修改工程属性,编译的时候会报如下的错误: 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”的访问被拒绝。

① 以管理员的方式启动Visual Studio 2015 ② 重新打开刚才的项目 ③ 重新编译

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

C++调用 C# com

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

将 "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 具体的如下图所示:

创建一个文件: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;} 运行后的效果如下:

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

点击展开全文

更多推荐