65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Visual Studio .NET 中引用二进制不兼容的 COM 组件版本

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (4投票s)

2004年10月6日

4分钟阅读

viewsIcon

79878

downloadIcon

374

本教程解释了在处理二进制兼容性已损坏但保留了库名称和方法签名的 COM 组件时,如何配置 Visual Studio .NET 项目。

引言

当供应商发布不同版本的 COM 组件时,他们会保留二进制兼容性,以确保用一个版本的组件编译的程序能够与另一个版本一起工作(至少向后兼容)。例如 ADODB、MSXML 等。但有时,会出现一些特殊情况,导致二进制兼容性被破坏。这种情况会给开发带来问题,需要创建不同版本的项目文件。当使用不同版本的组件时,Visual Studio 项目中对围绕该 COM 组件构建的库的任何引用都必须进行更改。本文讨论了一种策略,用于促进使用二进制兼容性已损坏的同一 COM 组件的不同版本进行开发。

在 Visual Studio .NET 项目中引用 COM 组件

右键单击项目树中的 **References**,然后在 **Add Reference** 对话框中,选择 **COM** 选项卡。从显示的列表中选择 COM 组件,或浏览查找库文件。Visual Studio 使用 **tlbimp** 工具在组件上生成一个互操作包装器。此包装器程序集由项目命名为 **Interop.library.dll**。此程序集通过类型库 GUID 进行标识,并在 Assembly Properties 中显示为 Identity,如下图所示。

当不同版本的 COM 组件的二进制兼容性被破坏时,库 GUID 会发生变化,互操作程序集也不再兼容。但在我们的例子中,类型库中的库名称没有改变。这意味着命名空间 **library** 没有改变。为了模拟这种情况,我使用 Visual Basic 6.0 创建了一个简单的 COM 组件。该代码包含一个名为 TestDll 的库,其中有一个名为 TestComp 的组件。此组件有一个 DisplayTestMessage() 方法,该方法将显示一条消息,给出版本号。

以下是破坏了二进制兼容性的 Visual Basic 项目设置:

使用此代码,我创建了 COM 组件的两个版本:1.0.0.0 和 2.0.0.0,并将它们放在不同的目录中。生成的组件之间的差异将是 GUID(Identity)和消息框。库名称、组件名称和方法签名都相同。现在,要在 .NET 项目中使用此组件,可以使用以下代码:

using System;
using System.Windows.Forms;
using TestDll;

namespace TestReference
{
    public class TestForm : System.Windows.Forms.Form
    {
        static void Main() 
        {
            TestDll.TestCompClass test = new TestDll.TestCompClass();
            test.DisplayTestMessage();
        }
    }
}

当我们尝试通过在 **Add Reference** 对话框中选择 DLL 文件来将两个版本都添加到测试应用程序中时,在一个 DLL 添加后,对于第二个 DLL,Visual Studio 会给出以下错误,因为命名空间是相同的:

为了避免此警告消息,这里有一个解决方案:

  • 首先,在 **References** 中选择 DLL 的 1.0.0.0 版本,然后 **保存** 项目。
  • 在 Visual Studio **外部**,使用记事本打开 .csproj.vbproj 文件。
  • 在 **<Build><References>** 部分,查找库并更改名称。在本例中,我已将其从 TestDll 更改为 TestDll_1.0.0.0。
                    <Reference
                        Name = "TestDll_1.0.0.0"
                        Guid = "{CB8AD23D-7243-4DF6-A7D2-77E8B9AC4993}"
                        VersionMajor = "1"
                        VersionMinor = "0"
                        Lcid = "0"
                        WrapperTool = "tlbimp"
                    />
  • 在记事本中保存文件,然后在 Visual Studio 中 **重新加载**。这应该会刷新你的 **References**,显示新名称(如下图所示)。
  • 现在,添加对包含库的 2.0.0.0 版本的 DLL 文件的引用,然后保存项目。
  • 在记事本中打开项目文件,重复上述步骤,并将引用名称从 TestDll 更改为 TestDll_2.0.0.0。

重要提示: 记得在 Visual Studio 中保存项目,以便在 .csproj.vbproj 文件中看到更改!

现在我们有一个引用了两个版本的项目,有趣的是,你可以通过查看一个小警告图标(见下图)来直观地知道你的项目正在使用哪个版本的 DLL,并且程序是围绕哪个版本编译的。为了模拟真实世界的情况(只有一个版本的组件已安装),请重命名其中一个 COM 组件 DLL 文件,然后重新编译项目。Visual Studio 中会出现一个警告图标,但程序仍然可以使用任何可用的版本正常工作。

上述技术仅使开发环境更加容易。但在部署时,我们仍然必须确保构建正确版本的互操作程序集来面向客户端,并将其与可执行文件一起部署,主要是因为不同版本的 COM 组件的程序集名称将是相同的。

© . All rights reserved.