Ben*_*sen 5 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";
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了版本控制,我宁愿不必为程序集中的各个类型更改GUID或名称.
但这正是你必须做的,以防止COM类型相互干扰.[Guid]用于选择注册COM类的HKLM\Software\Classes\CLSID中的注册表项.具有相同Guid的两个不同版本将覆盖彼此的键.否则称为DLL Hell.更改公共接口需要一个新的Guid,以确保使用旧的Guid的客户不会死于不可能诊断错误行为.一项坚如磐石的COM要求.
省略[Guid]属性是非常可能的,现在将它留给CLR为你生成一个.现在程序集属性开始发挥作用,guid值由一个灵活的算法自动生成,该算法包括程序集名称和版本以及接口上的方法集及其参数.从而确保任何变化自动生成不同的guid.并且,正如预期和要求的那样,不同的[AssemblyVersion]将生成不同的[Guid].
另一种方法,就是我所说的"并排"意思,就是不注册程序集,而是依赖清单.它必须嵌入到客户端程序中,您可以使用该<clrClass>元素声明[ComVisible]类.版本控制现在成为部署细节.MSDN操作方法在这里.请记住,它必须嵌入客户端程序中,而不是[ComVisible]程序集中.这往往是一个问题.