C++ 与 C# 互掉
创建C++ dll库
- 01
新建一个 "cpp_and_cs"互掉的工程,如下图所示:
- 02
① 选择 DLL; ② 选择 空项目; ③ 点击 完成; 具体的如下图所示:
- 03
① 添加一个 “cpp_dll.cpp”的源文件; ② 在源文件中添加如下的代码: extern "C" __declspec(dllexport) int __stdcall getValueFromCppDll(){ return 100;}
- 04
编译后就可以看到生成的dll文件
通过C#调用C++dll
- 01
创建一个C# 控制台应用程序,具体的如下图所示:
- 02
在C#中添加如下的代码: using System.Runtime.InteropServices; [DllImport("cpp_and_cs.dll")] private static extern int getValueFromCppDll(); int nValue = getValueFromCppDll();System.Console.WriteLine(nValue);
- 03
将c++生成的dll拷贝一份到C#对应的目录下面去,如下图所示
- 04
将C#工程设置为启动项,使用快捷键 Ctrl+F5 运行;
- 05
至此C#调用C++就完成了,下面开始讲解c++调用C#
创建一个C# com 组件
- 01
创建一个c#的空项目,具体的如下图所示:
- 02
给工程添加一个“CSDLL.cs” 组件,如下图所示:
- 03
① 给 cs_dll 工程添加一个接口 ICSDLL ② 在接口中添加如下方法名; getValueFromCsDll
- 04
① 右键 CSDLL.cs ② 查看代码 ③ 在 CSDLL.cs 类型中添加方法 getValueFromCsDll 具体的代码如下: public int getValueFromCsDll(){ return 200; } 并且继承接口 ICSDLL
- 05
修改工程属性,编译的时候会报如下的错误: 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”的访问被拒绝。
- 06
① 以管理员的方式启动Visual Studio 2015 ② 重新打开刚才的项目 ③ 重新编译
- 07
编译完后,可以发现多了 cs_dll.tlb 这个文件,至此C#的com组件便生成了
C++调用 C# com
- 01
创建一个c++控制台应用程序,具体的流程如下:
- 02
将 "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 具体的如下图所示:
- 03
创建一个文件: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;} 运行后的效果如下:
- 04
方便他人亦是方便自己,如果觉得还行就点下下边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!