-
新建一个类库项目“CSharpLib”,平台为x86
-
项目“CSharpLib” --“Properties”–“AssemblyInfo.cs”
ComVisible(false) 改成 ComVisible(true)
-
项目“CSharpLib”–右键“属性”
a. “生成”–勾选 “为COM互操作注册”
b. “签名”–勾选“为程序集签名”,然后选择“新建”,填写一个秘钥文件名称,取消勾选“使用密码保护秘钥文件”
-
写C# 的代码,任何一个公开的类都必须要有接口定义
[ComVisible(true)] [Guid("E3515A2A-F7BF-4BAC-9226-2FEA7929D747")] public interface ITest { [DispId(1)] int Add(int a, int b); } //如果有多个函数 DispId(x),x的值要增加[ComVisible(true)] [Guid("0EE078B2-3108-46F4-80BC-ED6AB33331B0")] [ProgId("CSharpLib.TestImpl")] [ClassInterface(ClassInterfaceType.None)] public class TestImpl : ITest { public virtual int Add(int a, int b) { return 0; } protected int Sun() { return 10; } }[ComVisible(true)] [Guid("9F46F525-6812-4732-87D2-6BB08543B78A")] [ProgId("CSharpLib.Test")] [ClassInterface(ClassInterfaceType.None)] public class Test : TestImpl { public override int Add(int a, int b) { return a + b + Sun(); } }GUID属性里面的那个字符串,在“工具”菜单下面,“创建 GUID"
-
编译生成的C# 的dll,cmd进入Dll所在的路径下,用下面的命令将DLL加入到全局缓存中
gacutil -I CSharpLib.dll
-
找到自己电脑中“RegAsm.exe”,然后注册com组件,cmd下输入自己电脑的“RegAsm.exe”的路径 和dll的路径,提示成功即可在C++上引用了
注册 C:WindowsWinSxSwow64_regasm_b03f5f7f11d50a3a_4.0.15805.0_none_9be7d950c1f8adddRegAsm.exe C:C#CSharpLibCSharpLibbinx86DebugCSharpLib.dll
注销 C:WindowsWinSxSwow64_regasm_b03f5f7f11d50a3a_4.0.15805.0_none_9be7d950c1f8adddRegAsm.exe /u C:C#CSharpLibCSharpLibbinx86DebugCSharpLib.dll
-
注册成功后,在C#的项目下的“引用”中可以看得见注册的com组件
-
创建一个C++项目,平台最好与C#的平台一致
-
将上面注册dll为com组件下的“CSharpLib.tlb”文件拷贝到C++的项目文件夹下
-
C++主函数中的代码如下
#include "stdafx.h" #include
#include #import "C:/C#/C++Demo/C++Demo/CSharpLib.tlb" ---这个一定要应用 using namespace std; int main(int argc, _TCHAR* argv[]) { //下面是com组件的调用 CoInitialize(NULL); CSharpLib ::ITestPtr ptr; HRESULT HRES = ptr.CreateInstance(__uuidof(CSharpLib::Test)); if (HRES == S_OK) { std::cout< Add(1,2)<< std::endl; } system("pause"); CoUninitialize(); return 0; }



