栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++调用C#生成的COM组件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++调用C#生成的COM组件

C++调用C#生成的COM组件 C#生成COM组件
  1. 新建一个类库项目“CSharpLib”,平台为x86

  2. 项目“CSharpLib” --“Properties”–“AssemblyInfo.cs”

    ComVisible(false) 改成 ComVisible(true)
    
  3. 项目“CSharpLib”–右键“属性”

    a. “生成”–勾选 “为COM互操作注册”

    b. “签名”–勾选“为程序集签名”,然后选择“新建”,填写一个秘钥文件名称,取消勾选“使用密码保护秘钥文件”

  4. 写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"

  5. 编译生成的C# 的dll,cmd进入Dll所在的路径下,用下面的命令将DLL加入到全局缓存中

    gacutil -I CSharpLib.dll 
    
  6. 找到自己电脑中“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
    
  7. 注册成功后,在C#的项目下的“引用”中可以看得见注册的com组件

C++调用COM组件
  1. 创建一个C++项目,平台最好与C#的平台一致

  2. 将上面注册dll为com组件下的“CSharpLib.tlb”文件拷贝到C++的项目文件夹下

  3. 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;
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954334.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号