将C ++ COM对象更新为C#

时间:2011-08-16 13:39:12

标签: c# com com-interop

我们在非托管C ++中声明并实现了COM接口。我们不再希望维护此程序集,但需要进行一些更改,并且仍然可以向后兼容。

我想要做的是在C#中编写所有新代码,并使其成为ComVisible。从this thread我看到对TreatAs的引用来替换旧接口。

我正在考虑与Jonathan Peppers一样关于ProgId,Guid等的路径。我将实现确切的接口作为旧版本作为新实现的包装器。我也在考虑在生成的interop包装器中添加MarshalAs属性,以确保数据类型尽可能相同。

在使用此功能时,我还应该考虑其他什么吗?有经验进行此转换的任何人?

编辑:我确实有服务器的IDL文件。我不确定是否有一种方法可以基于此自动生成代码。 COM不是我非常熟悉的东西。

编辑问:我应该如何处理现有客户使用的HRESULT?

ADDED:想想我应该将其他读者指向different fix,这对我的场景不可用,因为我无法使用现有的com重新编译所有.NET应用程序:

BjørnarSundsbø

2 个答案:

答案 0 :(得分:2)

一种快速入门方式:

  • 使用tlbimp(或Visual Studio)
  • 将现有COM对象导入C#
  • 加载.Net Reflector并获取生成的界面以放入新项目
  • 在C#
  • 中实现生成的界面
  • 导入声明切换为导出而不是

这应该从一开始就使所有类型和方法签名正确。这是将现有COM接口移植到C#的一个很好的起点。

答案 1 :(得分:1)

似乎是by design阻止托管COM对象从托管客户端使用。

以下是same problem以及this thread的一些链接,提供了一些解决方案。还要看看Jonathan Peppers提供的答案,看看如果你只需要从非托管应用程序中使用它就可以开始。

我认为我可以解决这个问题的唯一方法是一个混乱的解决方案,我在C#中创建新代码,在其上添加一个COM层。然后创建一个额外的COM层作为非托管C ++,它访问第一层,以便我的.NET应用程序可以访问它。 {Unmanaged COM暴露原始界面} => {管理COM,重写COM的原始逻辑}。然后,所有现有应用程序将访问“{Unmanaged COM ...}”。如果我变得绝望,那可能是一种方式。目前我正在放弃这种方法并寻找其他解决方案。

如果可以,请重新编译托管应用程序以使用新程序集,请执行此操作。您仍然可以使用来自VB6,非托管C ++等的托管COM。如果您仍然需要从托管引用作为COM,您可以使用one of the referenced posts中指定的方法创建新实例,只要您不需要创建一个interop包装器。