我需要部署同一个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";
}
}
}
}
答案 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以查看已注册的程序集版本来解决问题。