繁体   English   中英

COM互操作并排组件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM