更新C++;COM对象到C# 我们在非托管C++中声明并实现了COM接口。我们不再希望维护此程序集,但确实需要进行一些更改,并且仍然保持向后兼容
我想做的是,用C#编写所有新代码,并使其可见。从中,我看到了对TreatAs的引用,以替换旧接口 关于ProgId、Guid等,我的想法与jonathanpeppers相同。我将实现与旧版本相同的接口,作为新实现的包装。我还考虑在生成的互操作包装中添加Marshallas属性,以确保数据类型是相同的(如果可能的话) 在处理这件事时,我还有什么要考虑的吗?有没有人有做这种转换的经验 编辑:我有服务器的IDL文件。我不确定是否有一种方法可以基于此自动生成代码。COM不是我非常熟悉的东西 编辑Q:我应该如何处理现有客户端使用的HRESULT 添加:我想我应该将其他读者指向一个,它不适用于我的场景,因为我无法使用现有com重新编译所有.NET应用程序:更新C++;COM对象到C# 我们在非托管C++中声明并实现了COM接口。我们不再希望维护此程序集,但确实需要进行一些更改,并且仍然保持向后兼容,c#,com,com-interop,C#,Com,Com Interop,我想做的是,用C#编写所有新代码,并使其可见。从中,我看到了对TreatAs的引用,以替换旧接口 关于ProgId、Guid等,我的想法与jonathanpeppers相同。我将实现与旧版本相同的接口,作为新实现的包装。我还考虑在生成的互操作包装中添加Marshallas属性,以确保数据类型是相同的(如果可能的话) 在处理这件事时,我还有什么要考虑的吗?有没有人有做这种转换的经验 编辑:我有服务器的IDL文件。我不确定是否有一种方法可以基于此自动生成代码。COM不是我非常熟悉的东西 编辑Q:我应
比约纳尔·桑德斯伯一个快速入门的方法:
- 使用(或Visual Studio)将现有COM对象导入C#
- 加载并获取生成的接口以放入新项目中
- 用C语言实现生成的接口#
- 将任何导入声明切换为导出
如果可以,请重新编译托管应用程序以使用新程序集。您仍然可以使用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)。