【问题标题】:Consume C#.NET COM Component in C++ [duplicate]在 C++ 中使用 C#.NET COM 组件 [重复]
【发布时间】:2014-10-14 18:33:50
【问题描述】:

我注意到有人问similar question如何在 C++ 中使用 C# COM 组件

但是该线程被标记为重复,因为问题的标题太笼统并且没有指定 C#。

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

【问题讨论】:

  • 那个线程(Rowland Shaw 认为是重复的)是关于从另一个 C# COM 组件调用 C# COM 组件来测试它是否是有效的 COM 组件。我的主题是关于从 C++ 代码中使用 C#.NET COM 组件。
  • 是的 Rowland Shaw 你现在是对的,我已经在我的问题描述中提到了与“类似问题”的 HREF 相同的 URL。为什么我在这里回答是因为没有可编辑的框将答案放在那里。这也是我在最初的问题中提到的。
  • 当某些东西作为副本被关闭时,您可以将您的答案添加到原始问题中,在这种情况下,在stackoverflow.com/q/410005/50447

标签: c# c++ .net com


【解决方案1】:

以下是我对这种情况的回答:

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

  • 注册(regsvr32)
  • 在 Visual Studio 解决方案中添加对 COM dll 的引用
  • 将在 .NET 项目的 bin 目录中创建一个 Interop 文件,我们就完成了

但反过来也没有上面那么简单。
所以这次我提出了我们需要遵循的步骤,以便在 C++ 代码中引用 COM 可见的 .NET dll。

  • 使用 regasm 注册 COM Visible .NET 组件,如下所示:
    regasm /tlb
    例如

    regasm "C:\SampleProject\bin\Release\Atreya.Anugrah.ComVisibleComponent.dll" /tlb
    
  • 在 .h 文件中引用 .NET 组件,如下所示:
    #import "" named_guids raw_interfaces_only
    例如

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

    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()
    

附:这篇文章没有解释如何让我们的 .NET 组件作为 COM 可见。请参阅其他帖子/文章,因为这是非常简单的活动。

合十! (问候)
Anugrah Atreya

【讨论】:

  • 我同意这是重复的,如果可能,管理员可以删除。
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多