ActiveX/COM/VB6企业项目的生成过程



我们使用微软的ActiveX/COM(VB6)技术开发了一个软件系统。在过去的一年里,我对自动化构建过程和整个供应链管理越来越感兴趣。我深入搜索了网络的大部分内容,以获取有关如何使用基于COM的软件系统进行供应链管理的最佳实践的信息。

COM的"问题"是,引用组件通过一个唯一的接口id来保存引用。当您重新编译被引用的组件时,id可能会更改,并且引用不再有效。这里的主要问题是,iid被编译成二进制文件。因此,当我不想将编译后的文件签入版本控制时,每个开发人员都必须编译自己的版本并获得其他id。

当我想在一台干净的构建机器上检查源代码来编译系统时,这是不可能的,因为所有的引用都是无效的(没有二进制文件,没有接口ID)。

我只是想知道,如果有一些最佳实践,如何为COM项目(VB6)建立一个自动化构建系统?

编辑:是的,我知道兼容性设置。但是以这样一个场景为例,我想在没有任何二进制文件的干净构建机器上构建wohle系统。当你说一个项目是二进制兼容的,你必须提供项目兼容的二进制。

我想我必须编写一个自定义的构建工具,在编译项目前后修改项目文件中的引用和兼容性设置。

因为VB6/COM是一种非常广泛的技术,我只是觉得必须有一个现成的解决方案。

我们通常使用二进制兼容性进行编译。当我们修改组件的公共接口时,我们使用项目兼容性进行编译。但是,当您更改许多其他组件使用的基本组件的接口时,您必须手动更改所有引用项目到项目的兼容性,重新编译它们,然后改回二进制兼容性。这是我想要自动化的主要过程。

您可以告诉VB6通过将项目的兼容性设置从"无兼容性"更改为"二进制兼容性"来重用GUID(IID的CLSID和LIBID等)。您可以在项目->您的项目属性下找到这些设置。兼容性设置位于"项目属性"窗口的"组件"选项卡上。有三种选择:

  • 无兼容性
  • 项目兼容性
  • 二进制兼容性

以下是MSDN对它们的评价:

无兼容性


使用此设置,否强制执行兼容性。视力的Basic创建新的接口ID每次生成或编译你的项目。每个版本builded只能与一起使用创建的应用程序组件的特定构建。

项目兼容性


使用此设置,您可以与特定兼容的项目组件项目。While new type生成库信息时维护类型库标识符以便测试项目仍然可以引用到组件项目。此设置用于保持兼容性测试期间。因此,一旦组件被释放,它的行为与"无兼容性"设置相同。

二进制兼容性


编译项目时,VisualBasic只创建新的Class和必要时的接口ID。它保留类和接口ID从以前的版本使用早期版本编译的程序版本将继续工作。如果你正在做出改变在不兼容的版本中,VisualBasic会警告您。如果你想保持与旧的,ActiveX的已发布版本组件,这是您的设置需要使用。

听起来您当前正在编译无兼容性。正如MSDN文章所述,您需要使用二进制兼容性来保持组件的新版本与旧版本兼容。你现在可以通过以下操作来做到这一点:

  • 使用无兼容性编译每个项目一次

  • 将这些"干净"的版本保存到构建人员可以轻松访问的文件夹中,例如网络共享,或者将它们置于源代码管理中。

  • 返回并将所有项目更改为"二进制兼容性",并将"兼容文件"指向您刚刚在网络/源代码管理中保存的相应版本(不要将兼容文件指向您编译项目的同一路径)。兼容文件应该是不会更改的原始组件的单独副本。它的存在只是为了在重新编译时VB可以将ID从该文件复制到您的项目中)。

每次重新编译项目时,它们都会重用组件的兼容(原始)版本中的GUID。

编辑:正如Joe在评论中提到的,您还必须识别类接口何时发生了更改(也就是说,当一个接口发生了足够的更改,您可以更长时间地保持与以前版本的二进制兼容性)。当这种情况发生时,您希望与以前版本的组件彻底决裂:重新编译一个新的"干净"版本(即不兼容),并在未来的版本中使用该新版本作为兼容文件。但是,需要注意的是,只有当类接口(属性和方法)发生更改时,才应该重新开始。事实上,当一个项目与以前版本的组件不再兼容时,VB会向您发出警告。

如果你想生活在边缘


在我工作的地方,我们倾向于(ab)在大多数项目中使用无兼容性,尽管这不是真正正确的做事方式(您应该使用二进制兼容性)。在我们公司,这是一种懒惰,因为我们有一个自动构建工具,可以为我们编译所有项目,该工具的主要功能之一是可以自动修复项目之间损坏的项目引用。由于构建工具为我们修复了这一问题,因此使用二进制兼容性的动机较小。

为什么二进制兼容性更好(或者…为什么你不应该做我们做的事情)


二进制兼容性通常是更好选择的几个原因:

  • 微软这么说

  • 如果您的所有组件都与以前版本的软件二进制兼容,那么您可以轻松地重新编译单个组件并将其重新分发给客户。这使得错误修复程序/修补程序更易于部署。如果您在项目中使用"无兼容性",则每次需要发布小补丁时,都必须重新编译并重新分发整个应用程序,因为较新的组件(可能)无法与

    Visual Build Pro。如果你仍然停留在VB6的土地上,并且必须建立专业的产品,我强烈建议你看看这个产品。它有一个免费试用版,物超所值(此外,它在.Net和其他平台的持续集成方面做得很好。)自从我们开始使用它以来,它在每次发布时都将我们从DLL地狱中拯救了出来。据我所知,没有其他方法可以在VB6中创建一个像样的构建框。

    正如Mike Spross所建议的,您应该使用二进制兼容性。你可以(也应该)建立在一台干净的机器上。您可以通过将当前生产二进制文件(ActiveX DLL和OCX)的副本保存在源代码管理系统中的"兼容"目录中来做到这一点。当您选择二进制兼容性时,所有项目都应该引用此副本。例如,将新的二进制文件放入。。。\版本和兼容的二进制文件位于。。。\兼容。当新版本投入生产时,您可以复制。。。\释放到。。。\兼容。通过这种方式,您可以保持从一个版本到下一个版本的兼容性。

    在二进制兼容模式下,如果向类中添加新方法,VB将创建一个新的IID。请记住,在COM中,接口是不可变的。如果你对一个界面做了最细微的改变,你就是在创造新的东西。VB遵循COM的这一规则,但使用了一些烟雾;镜像以防止破坏旧的客户端代码。因为VB"知道"新接口是旧接口的100%超集(这是二进制兼容性所确保的),所以它可以使用"接口转发"。接口转发只是将所有引用从旧接口重定向到新接口。如果没有这个技巧,您将不得不为您修改的任何ActiveX组件创建新版本(具有不同的名称和CLSID)。DLL地狱会变成DLL Armargeddon!

    VB将所有接口转发信息存储在组件的资源中。当您注册组件时,它会将所有接口IID写入HKCR\interface。旧的接口中会有转发信息。只有"真正的"接口才会引用实际的coclass。

    ActiveX/COM/VB6企业项目的生成过程

    我们使用微软的ActiveX/COM(VB6)技术开发了一个软件系统。在过去的一年里,我对自动化构建过程和整个供应链管理越来越感兴趣。我深入搜索了网络的大部分内容,以获取有关如何使用基于COM的软件系统进行供应链管理的最佳实践的信息。

    COM的"问题"是,引用组件通过一个唯一的接口id来保存引用。当您重新编译被引用的组件时,id可能会更改,并且引用不再有效。这里的主要问题是,iid被编译成二进制文件。因此,当我不想将编译后的文件签入版本控制时,每个开发人员都必须编译自己的版本并获得其他id。

    当我想在一台干净的构建机器上检查源代码来编译系统时,这是不可能的,因为所有的引用都是无效的(没有二进制文件,没有接口ID)。

    我只是想知道,如果有一些最佳实践,如何为COM项目(VB6)建立一个自动化构建系统?

    编辑:是的,我知道兼容性设置。但是以这样一个场景为例,我想在没有任何二进制文件的干净构建机器上构建wohle系统。当你说一个项目是二进制兼容的,你必须提供项目兼容的二进制。

    我想我必须编写一个自定义的构建工具,在编译项目前后修改项目文件中的引用和兼容性设置。

    因为VB6/COM是一种非常广泛的技术,我只是觉得必须有一个现成的解决方案。

    我们通常使用二进制兼容性进行编译。当我们修改组件的公共接口时,我们使用项目兼容性进行编译。但是,当您更改许多其他组件使用的基本组件的接口时,您必须手动更改所有引用项目到项目的兼容性,重新编译它们,然后改回二进制兼容性。这是我想要自动化的主要过程。

    您可以告诉VB6通过将项目的兼容性设置从"无兼容性"更改为"二进制兼容性"来重用GUID(IID的CLSID和LIBID等)。您可以在项目->您的项目属性下找到这些设置。兼容性设置位于"项目属性"窗口的"组件"选项卡上。有三种选择:

    • 无兼容性
    • 项目兼容性
    • 二进制兼容性

    以下是MSDN对它们的评价:

    无兼容性


    使用此设置,否强制执行兼容性。视力的Basic创建新的接口ID每次生成或编译你的项目。每个版本builded只能与一起使用创建的应用程序组件的特定构建。

    项目兼容性


    使用此设置,您可以与特定兼容的项目组件项目。While new type生成库信息时维护类型库标识符以便测试项目仍然可以引用到组件项目。此设置用于保持兼容性测试期间。因此,一旦组件被释放,它的行为与"无兼容性"设置相同。

    二进制兼容性


    编译项目时,VisualBasic只创建新的Class和必要时的接口ID。它保留类和接口ID从以前的版本使用早期版本编译的程序版本将继续工作。如果你正在做出改变在不兼容的版本中,VisualBasic会警告您。如果你想保持与旧的,ActiveX的已发布版本组件,这是您的设置需要使用。

    听起来您当前正在编译无兼容性。正如MSDN文章所述,您需要使用二进制兼容性来保持组件的新版本与旧版本兼容。你现在可以通过以下操作来做到这一点:

    • 使用无兼容性编译每个项目一次

    • 将这些"干净"的版本保存到构建人员可以轻松访问的文件夹中,例如网络共享,或者将它们置于源代码管理中。

    • 返回并将所有项目更改为"二进制兼容性",并将"兼容文件"指向您刚刚在网络/源代码管理中保存的相应版本(不要将兼容文件指向您编译项目的同一路径)。兼容文件应该是不会更改的原始组件的单独副本。它的存在只是为了在重新编译时VB可以将ID从该文件复制到您的项目中)。

    每次重新编译项目时,它们都会重用组件的兼容(原始)版本中的GUID。

    编辑:正如Joe在评论中提到的,您还必须识别类接口何时发生了更改(也就是说,当一个接口发生了足够的更改,您可以更长时间地保持与以前版本的二进制兼容性)。当这种情况发生时,您希望与以前版本的组件彻底决裂:重新编译一个新的"干净"版本(即不兼容),并在未来的版本中使用该新版本作为兼容文件。但是,需要注意的是,只有当类接口(属性和方法)发生更改时,才应该重新开始。事实上,当一个项目与以前版本的组件不再兼容时,VB会向您发出警告。

    如果你想生活在边缘


    在我工作的地方,我们倾向于(ab)在大多数项目中使用无兼容性,尽管这不是真正正确的做事方式(您应该使用二进制兼容性)。在我们公司,这是一种懒惰,因为我们有一个自动构建工具,可以为我们编译所有项目,该工具的主要功能之一是可以自动修复项目之间损坏的项目引用。由于构建工具为我们修复了这一问题,因此使用二进制兼容性的动机较小。

    为什么二进制兼容性更好(或者…为什么你不应该做我们做的事情)


    二进制兼容性通常是更好选择的几个原因:

    • 微软这么说

    • 如果您的所有组件都与以前版本的软件二进制兼容,那么您可以轻松地重新编译单个组件并将其重新分发给客户。这使得错误修复程序/修补程序更易于部署。如果您在项目中使用"无兼容性",则每次需要发布小补丁时,都必须重新编译并重新分发整个应用程序,因为较新的组件(可能)无法与较旧的组件一起使用。

    • 您正在尽自己的职责来维护COM标准:在COM中,类ID和接口ID应该唯一标识一个类或接口。如果你的类和/或接口在构建之间没有改变,那么就没有理由为这些类和接口生成新的ID(事实上,同一个类会有多个ID)。二进制兼容性允许你在不同的构建中维护相同的ID,这意味着你是一个好公民,并遵循COM约定。

    • 注册表噪音更小。如果您总是向与旧版本二进制不兼容的客户部署新组件,则每个新版本都会向注册表中添加新信息。除其他事项外,每个新接口和类ID都必须注册。如果你保持所有的二进制兼容,那么安装程序只需要在一个地方添加注册表项,因为你的类ID和接口ID不会改变。

    • 如果您正在公开其他第三方应用程序正在使用的公共API或组件,您肯定会希望使用二进制兼容性,这样您就不会破坏依赖于您的代码的第三方软件。

    Visual Build Pro。如果你仍然停留在VB6的土地上,并且必须建立专业的产品,我强烈建议你看看这个产品。它有一个免费试用版,物超所值(此外,它在.Net和其他平台的持续集成方面做得很好。)自从我们开始使用它以来,它在每次发布时都将我们从DLL地狱中拯救了出来。据我所知,没有其他方法可以在VB6中创建一个像样的构建框。

    正如Mike Spross所建议的,您应该使用二进制兼容性。你可以(也应该)建立在一台干净的机器上。您可以通过将当前生产二进制文件(ActiveX DLL和OCX)的副本保存在源代码管理系统中的"兼容"目录中来做到这一点。当您选择二进制兼容性时,所有项目都应该引用此副本。例如,将新的二进制文件放入。。。\版本和兼容的二进制文件位于。。。\兼容。当新版本投入生产时,您可以复制。。。\释放到。。。\兼容。通过这种方式,您可以保持从一个版本到下一个版本的兼容性。

    在二进制兼容模式下,如果向类中添加新方法,VB将创建一个新的IID。请记住,在COM中,接口是不可变的。如果你对一个界面做了最细微的改变,你就是在创造新的东西。VB遵循COM的这一规则,但使用了一些烟雾;镜像以防止破坏旧的客户端代码。因为VB"知道"新接口是旧接口的100%超集(这是二进制兼容性所确保的),所以它可以使用"接口转发"。接口转发只是将所有引用从旧接口重定向到新接口。如果没有这个技巧,您将不得不为您修改的任何ActiveX组件创建新版本(具有不同的名称和CLSID)。DLL地狱会变成DLL Armargeddon!

    VB将所有接口转发信息存储在组件的资源中。当您注册组件时,它会将所有接口IID写入HKCR\interface。旧的接口中会有转发信息。只有"真正的"接口才会引用实际的coclass。

最新更新