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

使用 ShadowCopyFiles 合适地解决 EXE/DLL 锁定问题

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.61/5 (13投票s)

2007年12月21日

CPOL

1分钟阅读

viewsIcon

36130

使用 ShadowCopyFiles 合适地解决 EXE/DLL 锁定问题,适用于 .NET 2.0 及更高版本

引言

不幸的是,.NET Framework 不支持修改现有的 AppDomain。 因此,如果有人想要配置可执行文件的 AppDomain 设置,则需要一个包装器。 本文简要概述了这种包装器可能是什么样子。

背景

随着 .NET Framework 2.0 的发布,微软引入了一种关于配置创建的 AppDomain 的新理念。 想法是现有的 AppDomain 配置不再需要更改。 因此,如果您使用影响现有 AppDomain 配置的方法(例如 ShadowCopyFiles),Visual Studio 会显示警告,告知该方法已被标记为过时。

到目前为止一切都很好,如果您想更改应用程序的默认 AppDomain 的配置,则会出现问题。 人们可能会期望从 app.config 文件获得支持。 不幸的是,框架尚未包含此类设置。
这就是本文描述的包装器的作用。

Using the Code

包装器类是一个非常小的独立控制台应用程序。 它托管一个自定义 AppDomain,在该 AppDomain 中使用给定的设置执行配置的应用程序。

using System;
using System.Configuration;

namespace HelveticSolutions.ExecutableWrapper
{
    internal class ExecutableWrapper
    {
        private static void Main(string[] commandLineArguments)
        {
            AppDomainSetup executableDomainSetup;
            AppDomain executableDomain;

            // Create app domain setup
            executableDomainSetup = new AppDomainSetup();
            // Apply settings
            executableDomainSetup.ShadowCopyFiles = 
                ConfigurationManager.AppSettings["ShadowCopyFiles"];
            // Create new app domain
            executableDomain = AppDomain.CreateDomain
                ("", AppDomain.CurrentDomain.Evidence, executableDomainSetup);
            // Execute configured application in the newly created app domain
            executableDomain.ExecuteAssembly(ConfigurationManager.AppSettings
                ["ApplicationFullPath"], AppDomain.CurrentDomain.Evidence, 
                commandLineArguments);
        }
    }
}

App.config 文件包含以下 appSettings

<appSettings>
    <add key="ShadowCopyFiles" value="true"/>
    <add key="ApplicationFullPath" value="C:\AnyPath\MyExecutable.exe"/>
</appSettings>

关注点

正如您可能已经注意到的,命令行参数直接传递给执行的应用程序。 在某些情况下,需要更改此设置。

上面的示例仅涵盖了 AppDomainSetupShadowCopyFiles 属性。 但是,这种方法可以扩展到 AppDomainSetup 的任何属性或方法。

历史

  • 2007 年 12 月 22 日 - 初始发布
  • 2014 年 11 月 16 日 - 更正了命名空间
© . All rights reserved.