[英]COM interop side-by-side assemblies
我需要部署同一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";
}
}
}
}
我宁愿不必为了版本控制而更改程序集中单个类型的GUID或名称。
但这正是您必须采取的措施,以防止COM类型相互干扰。 [Guid]用于在注册COM类的HKLM \\ Software \\ Classes \\ CLSID中选择注册表项。 具有相同Guid的两个不同版本将覆盖彼此的键。 否则称为DLL Hell。 更改公共接口要求使用新的Guid,以确保使用旧接口的客户端不会因无法诊断错误行为而死亡。 严格的COM要求。
忽略[Guid]属性是很有可能的,现在您将其留给CLR来为您生成一个。 现在,程序集属性开始起作用,guid值由一种平滑算法自动生成,该算法包括程序集名称和版本以及接口及其参数上的方法集。 因此,确保任何更改都会自动产生不同的指导。 并且,按预期和要求,不同的[AssemblyVersion]将生成不同的[Guid]。
我认为您所说的“并排”是另一种方法,即不注册程序集,而是依靠清单。 它必须嵌入在客户端程序中,您可以使用<clrClass>
元素声明[ComVisible]类。 现在,版本控制成为部署详细信息。 MSDN操作方法在此处 。 请记住,它必须嵌入在客户端程序中,而不是您的[ComVisible]程序集。 这往往是一个问题。
如果可以,请尝试后期绑定到本机应用程序中的互操作程序集。 我还建议不要使用自动生成AutoDual的界面,而是明确地生成自己读此以获得更多信息。 您可以通过打开regedit并搜索Guid和ProgId来解决该问题,以查看程序集的哪些版本已被注册。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.