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";
            }
        }
    }
}
4

2 回答 2

6

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

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

省略 [Guid] 属性是非常有可能的,您现在让 CLR 为您生成一个。现在程序集属性开始发挥作用,guid 值由一个巧妙的算法自动生成,其中包括程序集名称和版本以及接口上的一组方法及其参数。从而确保任何更改都会自动生成不同的 guid。而且,正如预期和要求的那样,不同的 [AssemblyVersion] 将生成不同的 [Guid]。

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

于 2010-11-22T12:58:02.347 回答
2

如果可以,请尝试后期绑定到本机应用程序中的互操作程序集。我还建议不要使用 AutoDual 自动生成界面,而是明确生成您自己的界面,请阅读内容以获取更多信息。您可以通过打开 regedit 并搜索 Guid 和 ProgId 以查看已注册的程序集版本来解决问题。

于 2010-11-22T12:14:12.227 回答