COM互操作并排组件

我需要部署同一个C#.NET项目的多个版本。 项目输出是一个COM互操作程序集,用于本机应用程序。 我遇到的问题是我必须并排部署这个程序集的几个版本,但无论我做什么似乎都没有创建不同的版本。 而是版本覆盖彼此。

我已经尝试更改程序集GUID,尝试更改程序集版本号,尝试重新生成程序集强名称密钥,尝试更改程序集标题和说明。 我宁愿不必更改程序集中各个类型的GUID或名称以进行版本控制。

如何确保这些版本不会相互覆盖,并且我可以并排查看和部署它们?

提前致谢!

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace InteropTest { [Guid("...")] [ClassInterface(ClassInterfaceType.AutoDual)] public class Test { public Test() { } public string Version { get { return "1.0"; } } } } 

我宁愿不必更改程序集中各个类型的GUID或名称以进行版本控制。

但这正是你必须做的,以防止COM类型相互干扰。 [Guid]用于选择注册COM类的HKLM \ Software \ Classes \ CLSID中的注册表项。 具有相同Guid的两个不同版本将覆盖彼此的键。 否则称为DLL Hell。 更改公共接口需要一个新的Guid,以确保使用旧的Guid的客户不会死于不可能诊断错误行为。 一个坚如磐石的COM要求。

省略[Guid]属性是非常可能的,现在将它留给CLR为你生成一个。 现在程序集属性开始发挥作用,guid值由一个灵活的算法自动生成,该算法包括程序集名称和版本以及接口上的方法集及其参数。 从而确保任何变化自动生成不同的guid。 并且,正如预期和要求的那样,不同的[AssemblyVersion]将生成不同的[Guid]。

另一种方法,就是我所说的“并排”意思,就是注册程序集,而是依赖于清单。 它必须嵌入客户端程序中,使用元素声明[ComVisible]类。 版本控制现在成为部署细节。 MSDN操作方法在这里 。 请记住,它必须嵌入客户端程序,而不是[ComVisible]程序集。 这往往是一个问题。

如果可以的话,尝试延迟绑定到本机应用程序中的互操作程序集。 我还建议不要使用AutoDual自动生成接口,而是显式生成您自己的读取以获取更多信息。 您可以通过打开注册表并搜索Guid和ProgId以查看已注册的程序集版本来解决问题。