COM互操作的并行程序集

5
我需要部署多个版本的同一个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";
            }
        }
    }
}
2个回答

6
我不愿意为了版本控制而更改程序集中各个类型的GUID或名称。但这正是你必须做的,以防止COM类型相互干扰。[Guid]用于选择在HKLM\Software\Classes\CLSID中注册COM类的注册表键。具有相同Guid的两个不同版本将覆盖彼此的密钥。这也被称为DLL地狱。更改公共接口需要新的Guid,以确保使用旧接口的客户端不会出现无法诊断的错误行为。这是一个坚如磐石的COM要求。
省略[Guid]属性是完全可能的,现在您可以让CLR为您生成一个。现在程序集属性开始发挥作用,guid值是由一个巧妙的算法自动生成的,其中包括程序集名称和版本以及接口上的方法集和它们的参数。因此,确保任何更改都会自动产生不同的guid。并且,如预期所需,不同的[AssemblyVersion]将生成不同的[Guid]。
另一种方法,这也是我认为你所说的“并排”的意思,是不注册程序集,而是依靠清单。它必须嵌入到客户端程序中,您可以使用<clrClass>元素声明您的[ComVisible]类。现在版本控制成为部署细节。MSDN的操作方法在这里。请记住,它必须嵌入到客户端程序中,而不是您的[ComVisible]程序集。这往往是一个问题。

谢谢Hans,解决了我的疑惑。我现在会按照每种类型的新GUID路径进行操作。 - Bent Rasmussen

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接