我们在非托管C ++中声明并实现了COM接口。我们不再希望维护此程序集,但需要进行一些更改,并且仍然可以向后兼容。
我想要做的是在C#中编写所有新代码,并使其成为ComVisible。从this thread我看到对TreatAs的引用来替换旧接口。
我正在考虑与Jonathan Peppers一样关于ProgId,Guid等的路径。我将实现确切的接口作为旧版本作为新实现的包装器。我也在考虑在生成的interop包装器中添加MarshalAs属性,以确保数据类型尽可能相同。
在使用此功能时,我还应该考虑其他什么吗?有经验进行此转换的任何人?
编辑:我确实有服务器的IDL文件。我不确定是否有一种方法可以基于此自动生成代码。 COM不是我非常熟悉的东西。
编辑问:我应该如何处理现有客户使用的HRESULT?
ADDED:想想我应该将其他读者指向different fix,这对我的场景不可用,因为我无法使用现有的com重新编译所有.NET应用程序:
BjørnarSundsbø
答案 0 :(得分:2)
一种快速入门方式:
这应该从一开始就使所有类型和方法签名正确。这是将现有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包装器。