0

我们开发了一个小型 MMC 管理单元,用于安装应用程序的各种组件。特别是,它使用 System.EnterpriseServices.RegistrationHelper 向 COM+ 注册 .NET 程序集。逻辑很简单:首先,卸载现有程序集,然后复制新文件,然后安装新程序集。代码如下所示:

if (File.Exists(destination))
{
   try
    {
       new RegistrationHelper().UninstallAssembly(destination, ComPlusHelper.ApplicationName);
    }
    catch (Exception ex)
    {
        Log.LogError(...);
    }
}
File.Copy(source, destination, true);

但是,File.Copy 调用失败并显示错误“进程无法访问文件 xxxx,因为它正被另一个进程使用”。我花了一天时间阅读 MSDN 和谷歌搜索,但找不到解决方案。

有没有人有什么建议?

4

1 回答 1

0

如果 COM+ 应用程序正在运行,它将继续保持文件处于打开状态。任何时候要删除组件时,都应在删除组件时禁用并关闭应用程序,然后再重新启用应用程序。

您必须使用 ICOMAdminCatalog 或 ICOMAdminCatalog2 系列接口来执行此操作。任何搜索引擎都会出现大量在 VBScript 中执行以下任务的示例。我不知道有任何围绕 COM+ 管理的 .NET 包装器项目。

我认为是最佳实践的逻辑流程:

  1. 禁用应用程序
  2. 关闭应用程序
  3. 监控并等待活动呼叫关闭
  4. 卸载组件
  5. 启用应用程序

您也可以启动应用程序,但它应该在下次调用应用程序时自动启动。

这些步骤中的每一个都使用管理类的不同方面,其中一些已经作为单独的答案解决。

组织

在编写 COM+ 管理代码之前,您应该了解系统的层次结构。微软对此有很好的记录:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms687763%28v=vs.85%29.aspx

禁用

您将需要从 Applications 集合中获取 Application。要设置的属性是“IsEnabled”。更改属性后不要忘记保存更改。

关机

这是一个很好的答案:如何从 .NET 重新启动远程服务器上的 COM+ 应用程序?

在未运行的应用程序上调用 ShutdownApplication 是安全的。

监控

您需要在 ApplicationInstances 集合中查找应用程序。如果没有找到它,那么它一定已经关闭(或者从一开始就没有运行)。如果找到,则休眠一段可接受的时间,然后从刷新的集合实例中再次查找它。

卸载/重新安装

你已经解决了这部分。

启用

启用过程与禁用应用程序的过程相同,但 IsEnabled 属性值不同。

于 2013-02-11T17:36:51.183 回答