System.EnterpriseServices.RegistrationHelper不释放文件

时间:2009-11-17 19:00:14

标签: .net installer mmc

我们开发了一个小型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和谷歌搜索,但找不到解决方案。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

  1. 停用该应用程序
  2. 关闭应用程序
  3. 监控并等待活动呼叫关闭
  4. 卸载组件
  5. 启用应用程序
  6. 您也可以启动应用程序,但它应该在下次调用应用程序时自动启动。

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

    组织

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

    禁用

    您需要从Applications集合中获取应用程序。要设置的属性是“IsEnabled”。更改属性后,请不要忘记保存更改。

    关闭

    这是一个很好的答案:How do I restart a COM+ application on a remote server from .NET?

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

    监控

    您需要在ApplicationInstances集合中查找该应用程序。如果找不到,那么它必须已经关闭(或者从未在第一时间运行)。如果找到,请睡一段可接受的时间,然后从刷新的集合实例中再次查找。

    卸载/重新安装

    你已经解决了这个问题。

    启用

    启用过程与禁用应用程序所遵循的过程相同,但具有不同的IsEnabled属性值。