COM互操作并排组件

Ben*_*sen 5 c# com interop sxs

我需要部署同一个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";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

为了版本控制,我宁愿不必为程序集中的各个类型更改GUID或名称.

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

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

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