我需要部署同一C#.NET项目的多个版本。项目输出是要在 native 应用程序中使用的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";
            }
        }
    }
}

最佳答案



但是正是,它是您必须采取的措施,以防止COM类型相互干扰。 [Guid]用于在注册COM类的HKLM\Software\Classes\CLSID中选择注册表项。具有相同Guid的两个不同版本将覆盖彼此的键。否则称为DLL Hell。更改公共(public)接口(interface)需要新的Guid,以确保使用旧接口(interface)的客户端不会因无法诊断错误行为而死亡。严格的COM要求。

忽略[Guid]属性是很有可能的,您现在将其留给CLR来为您生成一个。现在,程序集属性开始起作用,guid值由一种平滑算法自动生成,该算法包括程序集名称和版本以及接口(interface)及其参数上的方法集。因此,确保任何更改都会自动产生不同的引导。并且,按预期和要求,不同的[AssemblyVersion]将生成不同的[Guid]。

我假设您对“并排”的意思是另一种方法,是不注册程序集,而是依靠 list 。它必须嵌入在客户端程序中,您可以使用<clrClass>元素声明您的[ComVisible]类。现在,版本控制成为部署详细信息。 MSDN how-to is here。请记住,它必须嵌入在客户端程序中,而不是您的[ComVisible]程序集。这往往是一个问题。

关于c# - COM互操作并排组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4245096/

10-12 12:36
查看更多