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

更新C++;COM对象到C# 我们在非托管C++中声明并实现了COM接口。我们不再希望维护此程序集,但确实需要进行一些更改,并且仍然保持向后兼容,c#,com,com-interop,C#,Com,Com Interop,我想做的是,用C#编写所有新代码,并使其可见。从中,我看到了对TreatAs的引用,以替换旧接口 关于ProgId、Guid等,我的想法与jonathanpeppers相同。我将实现与旧版本相同的接口,作为新实现的包装。我还考虑在生成的互操作包装中添加Marshallas属性,以确保数据类型是相同的(如果可能的话) 在处理这件事时,我还有什么要考虑的吗?有没有人有做这种转换的经验 编辑:我有服务器的IDL文件。我不确定是否有一种方法可以基于此自动生成代码。COM不是我非常熟悉的东西 编辑Q:我应

我想做的是,用C#编写所有新代码,并使其可见。从中,我看到了对TreatAs的引用,以替换旧接口

关于ProgId、Guid等,我的想法与jonathanpeppers相同。我将实现与旧版本相同的接口,作为新实现的包装。我还考虑在生成的互操作包装中添加Marshallas属性,以确保数据类型是相同的(如果可能的话)

在处理这件事时,我还有什么要考虑的吗?有没有人有做这种转换的经验

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

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

添加:我想我应该将其他读者指向一个,它不适用于我的场景,因为我无法使用现有com重新编译所有.NET应用程序:


比约纳尔·桑德斯伯

一个快速入门的方法:

  • 使用(或Visual Studio)将现有COM对象导入C#
  • 加载并获取生成的接口以放入新项目中
  • 用C语言实现生成的接口#
  • 将任何导入声明切换为导出
这将从一开始就确保所有类型和方法签名都正确。这是将现有COM接口移植到C#的一个很好的起点。

似乎是为了防止托管客户端使用托管COM对象

以下是指向的一些链接,并提供了一些解决方案。还可以查看Jonathan Peppers提供的答案,了解如果只需要在非托管应用程序中使用它,如何开始

我认为解决这个问题的唯一办法是使用一个混乱的解决方案,在这个解决方案中,我用C#创建新代码,并在上面添加一个COM层。然后,创建一个附加的COM层作为非托管C++访问第一层,这样,我的.NET应用程序就可以访问它。 {Unmanaged COM exposing the original interface}=>{Managed COM with rewrite the COM}的原始逻辑。然后,所有现有应用程序将访问“{Unmanaged COM…}”。如果我足够绝望,那可能是一种方法。目前,我正在放弃这种方法,寻找其他解决方案


如果可以,请重新编译托管应用程序以使用新程序集。您仍然可以使用VB6、非托管C++等托管COM等。如果您仍然需要引用托管的COM,那么您可以使用指定的方法创建新实例,只要不需要创建互操作包装。如果您不这样做,或者当COM接口不兼容自动化时,就不会发生这种情况。用这些基本信息更新您的问题。有没有办法从类型库或idl而不是客户端包装生成服务器端代码?类型库只包含声明,不包含代码。你必须重写代码,这是你的初衷。或者使用反射器代替反射器,因为反射器现在要花钱。你的意思是用ComVisible替换ComImport吗?我现在已经使用.NET Reflector和文件反汇编程序来生成代码。这段代码包括MethodIml之类的东西(MethodImplOptions和方法代码类型。我应该保留这些吗?是的,将ComImport更改为ComVisible。过去,我相信我删除了MethodImpl,没有问题。我运气不错。从原始类型库中提取了接口规范,编辑了一些属性,并为COM注册了程序集。现在的问题是,在构建obj时在客户端上,我遇到以下异常:无法将类型为“Interop.TC30Lib.TC30ClientClass”的对象强制转换为类型为“Interop.TC30Lib.TC30ClientClass”。我保留了应用程序使用的原始COM包装,这是支持现有应用程序所需的。有什么建议吗?抱歉。上次异常是在我尝试时引入的由于以下异常,将COM对象添加到GAC失败:System.IO.FileNotFoundException:检索CLSID为{A47E5E67-E8FF-4DD6-B4D7-FDC83B931146}的组件的COM类工厂失败,原因是出现以下错误:80070002系统找不到指定的文件。(HRESULT中的异常:0x80070002)。