在C+中使用C#NET COM组件+;

在C+中使用C#NET COM组件+;,c#,c++,.net,com,C#,C++,.net,Com,我注意到有人问一个关于如何使用C++中的C#COM组件的问题 但该线程被标记为重复,因为问题的标题太通用,并且没有指定C 由于我无法回答这个问题,我正在创建一个新的问题,我将回答这个问题,其他人也可以提出这些建议 在.NET中引用C++ COM组件是容易的;我们所要做的就是 寄存器(regsvr32) 在Visual Studio解决方案中添加对COM dll的引用 将在.NET项目的bin目录中创建一个互操作文件,我们已经完成了 但反过来就不像上面那么简单了。 这次我提出了一些步骤,我们需

我注意到有人问一个关于如何使用C++中的C#COM组件的问题

但该线程被标记为重复,因为问题的标题太通用,并且没有指定C


由于我无法回答这个问题,我正在创建一个新的问题,我将回答这个问题,其他人也可以提出这些建议

在.NET中引用C++ COM组件是容易的;我们所要做的就是

  • 寄存器(regsvr32)
  • 在Visual Studio解决方案中添加对COM dll的引用
  • 将在.NET项目的bin目录中创建一个互操作文件,我们已经完成了
但反过来就不像上面那么简单了。
这次我提出了一些步骤,我们需要遵循C++代码中的COM可见.NET DLL。p>
  • 向regasm注册COM Visible.NET组件,如下所示:
    regasm/tlb
    例如

    regasm "C:\SampleProject\bin\Release\Atreya.Anugrah.ComVisibleComponent.dll" /tlb
    
    #import "C:\SampleProject\bin\Release\Atreya.Anugrah.ComVisibleComponent.tlb"  named_guids raw_interfaces_only
    
    Atreya_Anugrah_ComVisibleComponent::IMyInterface* m_pIMyInterface;
    
  • 在.h文件中按如下方式引用.NET组件:
    #仅导入“”命名的\u guids原始\u接口\u
    例如

    #import "C:\SampleProject\bin\Release\Atreya.Anugrah.ComVisibleComponent.tlb"  named_guids raw_interfaces_only
    
    Atreya_Anugrah_ComVisibleComponent::IMyInterface* m_pIMyInterface;
    
  • 在.h文件中创建一个类,并像这样声明成员变量:
    ComVisibleComponent::*memberVariablePointer<例如

    #import "C:\SampleProject\bin\Release\Atreya.Anugrah.ComVisibleComponent.tlb"  named_guids raw_interfaces_only
    
    Atreya_Anugrah_ComVisibleComponent::IMyInterface* m_pIMyInterface;
    
  • 现在,在.cpp文件中初始化声明的成员变量指针,如下所示:

    hr = CoCreateInstance( 
    __uuidof(Atreya_Anugrah_ComVisibleComponent::<Name_of_CoClass_Implementing_Interface>), // COM class id 
    NULL, // Outer unknown
    CLSCTX_ALL, // Server INFO 
    Atreya_Anugrah_ComVisibleComponent::IID_<Name_of_Interface>, // interface id
    (void**) &m_pIMyInterface);  // Returned Interface                                                                                                                   
    
    if (FAILED(hr))
    {
    _com_error e(hr);
    strErrorMsg.Format("Error: Unable to create COM Visible .NET component. hr = %d. Message = %s",hr, e.ErrorMessage());
    return hr;
    }
    
    //you are good to use your initialized pointer here :)   
    m_pIMyInterface->foo()
    
    hr=CoCreateInstance(
    __uuidof(Atreya_Anugrah_ComVisibleComponent::),//COM类id
    NULL,//外部未知
    CLSCTX_ALL,//服务器信息
    Atreya_Anugrah_ComVisibleComponent::IID///接口id
    (无效**)和m_pIMyInterface);//返回接口
    如果(失败(小时))
    {
    _通信错误e(hr);
    strErrorMsg.Format(“错误:无法创建COM可见.NET组件。hr=%d.Message=%s”,hr,e.ErrorMessage());
    返回人力资源;
    }
    //您可以在此处使用初始化的指针:)
    m_pIMyInterface->foo()
    
另外,这篇文章并没有解释如何使我们的.NET组件作为COM可见。请参考其他帖子/文章,因为这是一项非常简单的活动


纳马斯特!(问候)
Anugrah Atreya

可能重复:该线程(Rowland Shaw认为是重复的)是从另一个C#COM组件调用C#COM组件,以测试其是否为有效的COM组件。我的线程是关于从C++代码中消费C.y..net com组件的。在这种情况下,它与Rowland Shaw是完全相同的,你现在是正确的,并且我已经在我的问题的描述中提到了与“ReFF”相同的URL。我之所以在这里回答是因为没有可编辑的框来放置答案。这也是我在我的原始问题中提到的。当某些内容作为副本关闭时,您可以将您的答案添加到原始问题,在这种情况下,我同意这是重复的,管理员可以删除,如果可能的话。