传统 COM 组件的部署一直是一项艰巨的任务。 组件需要全局注册,因此可能会导致重叠应用程序之间的不良副作用。 这种情况在 .NET Framework 应用程序中通常不是问题,因为组件完全与应用程序隔离或并行兼容。 Visual Studio 允许在 Windows作系统上部署隔离的 COM 组件。
ClickOnce 提供用于部署 .NET 应用程序的简单安全机制。 但是,如果应用程序使用旧版 COM 组件,则需要执行其他步骤来部署它们。 本主题介绍如何部署独立的 COM 组件和引用本机组件(例如,从 Visual Basic 6.0 或 Visual C++)。
有关部署独立 COM 组件的详细信息,请参阅 使用 ClickOnce 和 Registration-Free COM 简化应用部署。
免注册 COM
无注册 COM 是一种用于部署和激活独立 COM 组件的新技术。 它的工作原理是将所有组件的类型库和注册信息都安装到系统注册表中,该文件称为清单,存储在应用程序所在的同一文件夹中。
隔离 COM 组件要求在开发人员计算机上注册它,但不必在最终用户的计算机上注册它。 若要隔离 COM 组件,只需将其引用的 隔离 属性设置为 True。 默认情况下,此属性设置为 False,指示应将其视为已注册的 COM 引用。 如果此属性为 True,则会在构建时为该组件生成一个清单。 它还会导致在安装过程中将相应的文件复制到应用程序文件夹。
当清单生成器遇到独立 COM 引用时,它会枚举组件类型库中的所有 CoClass 条目,将每个条目与其对应的注册数据匹配,并为类型库文件中的所有 COM 类生成清单定义。
使用 ClickOnce 部署无注册 COM 组件
ClickOnce 部署技术非常适合用于部署独立 COM 组件,因为 ClickOnce 和无注册 COM 都要求组件具有清单才能部署。
通常,组件的作者应提供清单。 但是,如果没有,Visual Studio 能够自动为 COM 组件生成清单。 清单生成是在 ClickOnce 发布过程中执行的;有关详细信息,请参阅 发布 ClickOnce 应用程序。 此功能还允许你利用在早期开发环境中创作的旧组件,例如 Visual Basic 6.0。
ClickOnce 部署 COM 组件有两种方法:
使用引导程序部署 COM 组件;这适用于所有受支持的平台。
使用本机组件隔离(又称为无注册表 COM)进行部署。
隔离和部署简单 COM 组件的示例
为了演示无注册 COM 组件部署,此示例将在 Visual Basic 中创建基于 Windows 的应用程序,该应用程序引用使用 Visual Basic 6.0 创建的隔离本机 COM 组件,并使用 ClickOnce 部署它。
首先,需要创建本机 COM 组件:
创建本机 COM 组件
在 “文件 ”菜单中,使用 Visual Basic 6.0,单击“ 新建”,然后单击“ 项目”。
在“ 新建项目 ”对话框中,选择 Visual Basic 节点并选择 ActiveX DLL 项目。 在 “名称 ”框中,键入
VB6Hello。注释
无注册 COM 仅支持 ActiveX DLL 和 ActiveX 控件项目类型;不支持 ActiveX EXE 和 ActiveX 文档项目类型。
在 解决方案资源管理器中,双击 Class1.vb 打开文本编辑器。
在Class1.vb中,在方法生成的代码后面添加以下代码
New:Public Sub SayHello() MsgBox "Message from the VB6Hello COM component" End Sub生成组件。 在 “生成 ”菜单中,单击“ 生成解决方案”。
注释
无注册 COM 仅支持 DLL 和 COM 控件项目类型。 不能将可执行文件 (EXE) 用于无注册 COM。
现在,可以创建基于 Windows 的应用程序,并将对 COM 组件的引用添加到其中。
使用 COM 组件创建基于 Windows 的应用程序
使用 Visual Basic,在 “文件 ”菜单中单击“ 新建”,然后单击“ 项目”。
在“ 新建项目 ”对话框中,选择 Visual Basic 节点并选择 Windows 应用程序。 在 “名称 ”框中,键入
RegFreeComDemo。在 解决方案资源管理器中,单击“ 显示所有文件 ”按钮以显示项目引用。
右键单击 “引用 ”节点,然后从上下文菜单中选择 “添加引用 ”。
在“ 添加引用 ”对话框中,单击“ 浏览 ”选项卡,导航到 VB6Hello.dll,然后选择它。
VB6Hello 引用显示在引用列表中。
指向 工具箱,选择 按钮 控件,然后将其拖动到 Form1 窗体。
在 “属性” 窗口中,将按钮的 Text 属性设置为 Hello。
双击该按钮以添加处理程序代码,然后在代码文件中添加代码,使处理程序呈现如下格式:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim VbObj As New VB6Hello.Class1 VbObj.SayHello() End Sub运行该应用程序。 在 “调试 ”菜单中,单击“ 开始调试”。
接下来需要隔离控件。 应用程序使用的每个 COM 组件都以 COM 引用的形式在项目中表示。 这些引用在“解决方案资源管理器”窗口中的“引用”节点下可见。 (请注意,可以使用“项目”菜单上的“添加引用”命令直接添加引用,也可以通过将 ActiveX 控件拖到窗体上间接添加引用。
以下步骤演示如何隔离 COM 组件并发布包含隔离控件的更新应用程序:
隔离 COM 组件
在 解决方案资源管理器的 “引用 ”节点中,选择 VB6Hello 引用。
在 “属性” 窗口中,将 独立 属性的值从 False 更改为 True。
在 “生成 ”菜单中,单击“ 生成解决方案”。
现在,按 F5 时,应用程序按预期工作,但它现在在无注册 COM 下运行。 为了证明这一点,请尝试注销 VB6Hello.dll 组件并在 Visual Studio IDE 外部运行 RegFreeComDemo1.exe。 这一次,当单击按钮时,它仍然有效。 如果暂时重命名应用程序清单,它将再次失败。
注释
可以通过暂时注销 COM 组件来模拟其缺失。 打开命令提示符,通过键入 cd /d %windir%\system32转到系统文件夹,然后通过键入 regsvr32 /u VB6Hello.dll取消注册组件。 可以通过键入 regsvr32 VB6Hello.dll来再次注册它。
最后一步是使用 ClickOnce 发布应用程序:
使用独立 COM 组件发布应用程序更新
在 “生成 ”菜单中,单击“ 发布 RegFreeComDemo”。
此时会显示发布向导。
在发布向导中,在本地计算机的磁盘上指定一个位置,可在其中访问和检查已发布的文件。
单击“ 完成 ”以发布应用程序。
如果检查已发布的文件,将注意到包含 sysmon.ocx 文件。 该控件与此应用程序完全隔离,这意味着,如果最终用户的计算机具有另一个使用不同版本的控件的应用程序,则它不能干扰此应用程序。
引用本机程序集
Visual Studio 支持对本机 Visual Basic 6.0 或C++程序集的引用;此类引用称为本机引用。 可以通过验证引用的文件类型属性是否设置为 Native 或 ActiveX来判断引用是本机的。
若要添加本机引用,请使用“添加引用”命令,然后浏览到清单文件。 某些组件将清单放置在 DLL 中。 在这种情况下,您只需选择 DLL 本身,并在 Visual Studio 检测到组件包含嵌入的清单文件时将其添加为本机引用。 如果依赖文件或程序集与引用的组件位于同一文件夹中,Visual Studio 也会自动包含清单中列出的这些文件或程序集。
通过 COM 控制隔离,可以轻松部署尚未具有清单的 COM 组件。 但是,如果组件随清单一起提供,则可以直接引用清单。 事实上,应始终尽可能使用组件作者提供的清单,而不是使用 独立 属性。
无注册 COM 组件部署的限制
无注册 COM 比传统部署技术具有明显的优势。
并非每个组件都是适用于无注册 COM 的候选组件。 如果以下任一条件成立,则组件不适用:
组件是进程外服务器。 不支持 EXE 服务器;仅支持 DLL。
该组件是作系统的一部分,或者是系统组件,例如 XML、浏览器组件或Microsoft数据访问组件(MDAC)。 应遵循组件作者的重新分发策略;请咨询供应商。
该组件是应用程序的一部分,例如 Microsoft Office。 例如,不应尝试隔离Microsoft Excel 对象模型。 这是 Office 的一部分,只能在安装了完整 Office 产品的计算机上使用。
该组件旨在用作加载项或插件,例如 Office 加载项或 Web 浏览器中的控件。 此类组件通常需要由宿主环境定义的某种注册方案,这些方案超出了清单本身的范围。
该组件管理系统的物理或虚拟设备,例如打印后台处理程序的设备驱动程序。
该组件是数据访问可再发行组件。 数据应用程序通常需要安装单独的数据访问可再发行组件,然后才能运行。 不应尝试隔离 Microsoft ADO 数据控制、Microsoft OLE DB 或Microsoft数据访问组件(MDAC)等组件。 相反,如果应用程序使用 MDAC 或 SQL Server Express,则应将其设置为先决条件;请参阅 如何:使用 ClickOnce 应用程序安装先决条件。
在某些情况下,组件开发人员可能会重新设计它,以实现无注册 COM。 如果无法执行此作,你仍然可以使用 Bootstrapper 通过标准注册方案生成和发布依赖于它们的应用程序。 有关详细信息,请参阅 创建 Bootstrapper 包。
每个应用程序只能隔离一次 COM 组件。 例如,无法将同一 COM 组件与属于同一应用程序的两个不同的 类库 项目隔离开来。 这样做将导致生成警告,应用程序在运行时无法加载。 为了避免此问题,Microsoft建议在单个类库中封装 COM 组件。
在某些情况下,开发人员计算机上需要 COM 注册,即使应用程序的部署不需要注册也是如此。 该
Isolated属性要求在开发人员的计算机上注册 COM 组件,以便在生成过程中自动生成清单。 没有在构建过程中调用自行注册功能的注册捕获能力。 此外,类型库中未显式定义的任何类都不会反映在清单中。 在使用具有预先存在的清单(例如内置引用)的 COM 组件时,该组件在开发阶段可能不需要注册。 但是,如果组件是 ActiveX 控件,并且你想要将其包含在 工具箱 和 Windows 窗体设计器中,则需要注册。