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
通过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#
END
创建一个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组件便生成了
END
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;}
运行后的效果如下:
-