2010-11-22 94 views
4

我需要部署多个版本的相同C#.NET项目。项目输出是用于本机应用程序的COM互操作程序集。我遇到的问题是我必须并行部署这个程序集的几个版本,但是我所做的任何事似乎都不会创建不同的版本。相反,版本会覆盖彼此。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"; 
      } 
     } 
    } 
} 

回答

5

我宁可不必更改程序集中个别类型的GUID或名称以进行版本控制。

但是,正好你必须做什么来防止COM类型互相干扰。 [Guid]用于选择COM类注册的HKLM \ Software \ Classes \ CLSID中的注册表项。具有相同Guid的两个不同版本将覆盖每个其他密钥。否则称为DLL地狱。更改公共接口需要一个新的Guid,以确保使用旧的客户不会死于不可能诊断不当行为。坚如磐石的COM要求。

忽略[Guid]属性是非常可能的,现在您可以将其留给CLR来为您生成一个属性。现在,程序集属性开始扮演一个角色,guid值由一个流畅的算法自动生成,该算法包括程序集名称和版本以及接口上的一组方法和它们的参数。因此确保的任何自动变化产生不同的guid。并且,如预期和要求的,不同的[AssemblyVersion]将生成不同的[Guid]。

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

+0

感谢汉斯,为了解决这个问题。那么我现在要按照每种类型的新GUID路径。 – 2010-11-22 13:06:06

2

如果可以的话,尝试在本地应用程序中对interop程序集进行后期绑定。我还建议不要使用AutoDual自动生成界面,而是明确地生成自己的读取this以获取更多信息。您可以通过打开注册表编辑器并搜索Guid和ProgId来查看该程序集的哪些版本已被注册,从而解决问题。