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

一个用于在 COM+ 中部署 COM 组件的命令行工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (3投票s)

2008年1月25日

CPOL

4分钟阅读

viewsIcon

49673

downloadIcon

534

在混合了 .NET/COM 的 COM+ 环境中,可能需要一个命令行工具来在 COM+ 中部署 COM 组件。

引言

在混合了 .NET/COM 的 COM+ 环境中,可能需要一个命令行工具来在 COM+ 中部署 COM 组件。这样的工具通过允许完全基于命令行的部署来简化此类混合技术的部署。

在 DNA 的辉煌时代,COM+ 组件通过 MSI 进行注册。后者使用 COM+ 导出功能或 Orca 等其他工具创建,并包含组件 DLL、它们的依赖项(其他 DLL、TLB)以及包、组件和接口的 COM+ 配置属性。典型的 DNA 部署场景包括一系列代表多个 COM+ 包的 MSI,以及一个主 MSI 或安装脚本来绑定所有这些。

.NET [重新]引入了命令行部署的概念。Serviced Components 使用框架提供的 RegSvcs 工具进行注册。在这种情况下,假定程序集的依赖项存在于同一文件夹或 GAC 中,并且 COM+ 配置属性使用 EnterpriseServices 自定义属性内联 [代码] 注释。

上述差异使得在混合 .NET/COM 环境中的部署具有挑战性:虽然 .NET serviced components 是使用简单的命令行脚本部署的,但传统的 COM 组件部署需要要么是 MSI,要么是一系列更复杂的 VBS 脚本(基于 COMAdmin)组合在一起。当您尝试使用喜欢命令行方法而非 MSI 方法的现代 [ANT 类] 部署工具时,情况会变得更加麻烦。

RegComPlus

本文提出的解决方案是一个命令行实用程序 [类似于 RegSvcs],它允许轻松地、在一行命令中将 COM 组件注册到 COM+ 中。在 C++ 和 VB 等 COM 语言中缺乏内联注释的 COM+ 配置属性使得生活有点困难,因此该实用程序有两种模式:

基本模式: 适用于进程内(又名库)包,使用“所有默认”的 COM+ 配置。

这些注册方式类似于使用 RegSvcs 注册 service components 的方式:您只需要指定 DLL 的路径和包名,该实用程序将完成其余的工作。

示例:RegComPlus.exe %binpath%\example.dll ComPlusPackageName >> %logfile%

高级模式: 适用于进程外(又名服务器)包、包含多个 DLL 的包、需要对组件和/或接口进行特定配置的包。

此类 COM+ 包需要额外的配置信息,这些信息对注册实用程序不可用;这时配置文件就派上用场了。配置文件试图涵盖所有可通过 COM+ MMC 用户界面或 COMAdmin 库获得的所需 COM+ 属性。下面将详细介绍配置文件。

与基于 COMAdmin 的 VBS 脚本相比,使用配置文件的优势在于部署保持简单且易于维护:[更]复杂的 COM+ 配置代码封装在实用程序中,并且更改所需的配置不需要编码技能。此外,一旦创建了配置文件,部署就像使用 RegSvcs 注册 serviced components 一样,变成一个 [命令] 行:您只需要指定配置文件的路径,该实用程序将完成其余的工作。

示例:RegComPlus.exe %binpath%\example.config >> %logfile%

配置文件(高级模式)

配置文件基于 XML。它试图涵盖所有可通过 COM+ MMC 用户界面或 COMAdmin 库获得的所需 COM+ 属性。配置文件支持在包中安装多个文件,并配置 COM+ 对象层次结构的所有三个级别:包、组件和接口。

支持以下属性;请注意,支持部分配置,必需的节点/属性已标记。

Package(必需)

  • name:包名。必需。
  • isolation:Library/server。默认:library。
  • run_when_idle:true/false。默认:false。
  • queued:true/false。默认:false。
  • queue_listening:true/false。默认:false。

File(至少 1 个必需)

  • name: 文件名。必需。注意:如果未指定完整路径,则假定文件存在于配置文件所在的目录中。

Component(可选)

  • name:组件名。必需。注意:必须匹配组件的 ProgID。
  • transactions:0…4。默认:3。
    • TransactionIgnored = 0
    • TransactionNone = 1
    • TransactionSupported = 2
    • TransactionRequired = 3
    • TransactionRequiresNew = 4
  • synchronization:0…4。默认:2
    • SynchronizationIgnored = 0
    • SynchronizationNone = 1
    • SynchronizationSupported = 2
    • SynchronizationRequired = 3
    • SynchronizationRequiresNew = 4
  • jit:true/false。默认:true。
  • pooled:true/false。默认:true。

Interface(可选)

  • name:接口名。必需。注意:必须匹配接口的 ProgID。
  • queuing_enabled: true/false。默认:false。

简单示例

<configuration>
  <package name="ComPlusPackageName " isolation="server">
    <files>
      <file name="example.dll"/>
    </files>
  </package>
</configuration>

中等示例

<configuration>
  <package name="ComPlusPackageName">
    <files>
      <file name="example.dll"/>
    </files>
    <components>
      <component name="ComPlusComponent1" synchronization="3"/>
      <component name="ComPlusComponent2" 
        transactions="1" synchronization="1" jit="false"/>
    </components>
  </package>
</configuration>

复杂示例

<configuration>
  <package name="ComPlusPackageName" 
           isolation="server" 
           queued=”true” queue_listening=”true”>
    <files>
      <file name="example.dll"/>
      <file name="c:\mydirectory\example2.dll"/>
    </files>
    <components>
      <component name="ComPlusComponent1" synchronization="3"/>
      <component name="ComPlusComponent2" transactions="1" 
                    synchronization="1" jit="false"/>
      <component name="ComPlusComponent3" transactions="4"/>
      <component name="ComPlusComponent4">
          <interface name="ComPlusInterface4" queuing_enabled=”true”>
      </component>
    </components>
  </package>
</configuration>

技术栈

RegComPlus 实用程序是用 C# 编写的,并利用 COMAdmin 库通过 System.Runtime.InteropServices

其他阅读

© . All rights reserved.