COM互操作并排组件

时间:2010-11-22 11:49:33

标签: 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";
            }
        }
    }
}

2 个答案:

答案 0 :(得分:5)

  

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

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

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

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

答案 1 :(得分:2)

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