与是否可以使默认AppDomain使用某些程序集的卷影副本有关?,它描述了在特定目录的默认AppDomain中激活卷影复制的工作解决方案。
基本上,它说要使用这些简单的方法:
AppDomain.CurrentDomain.SetShadowCopyPath(aDirectory);
AppDomain.CurrentDomain.SetShadowCopyFiles();
但由于这里使用的方法被标记为过时,我想知道现在实现这一点的正确方法是什么。警告信息提示:
请调查使用AppDomainSetup.ShadowCopyDirectories而不是
AppDomain有一个名为SetupInformation
的此类成员,它可能会让您实现这种简单的
AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories = aDirectory;
AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true";
不幸的是,这没有任何效果。所以问题是,有没有办法改变当前应用程序域的AppDomainSetup来激活卷影复制?
据我所知,这些方法只适用于.NET Framework 1.1版本。对于所有更新的版本,您不能在主AppDomain上启用卷影复制。您需要创建一个新的AppDomain
并对其进行适当设置。一个简单的方法是创建一个加载器应用程序,该应用程序简单地:
- 创建一个启用卷影复制的新AppDomain。为此,您必须使用AppDomain.CreateDomain的重载之一,该重载采用AppDomainSetup参数
- 使用AppDomain.ExecuteAssembly方法执行主应用程序
在应用程序代码项目的卷影复制文章中可以找到一个很好的起点。以下程序取自文章,略有修改(未指定缓存路径:
using System;
using System.IO;
namespace Loader
{
static class Program
{
[LoaderOptimization(LoaderOptimization.MultiDomainHost)]
[STAThread]
static void Main()
{
/* Enable shadow copying */
// Get the startup path. Both assemblies (Loader and
// MyApplication) reside in the same directory:
string startupPath = Path.GetDirectoryName(
System.Reflection.Assembly
.GetExecutingAssembly().Location);
string configFile = Path.Combine(
startupPath,
"MyApplication.exe.config");
string assembly = Path.Combine(
startupPath,
"MyApplication.exe");
// Create the setup for the new domain:
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = "MyApplication";
setup.ShadowCopyFiles = "true"; // note: it isn't a bool
setup.ConfigurationFile = configFile;
// Create the application domain. The evidence of this
// running assembly is used for the new domain:
AppDomain domain = AppDomain.CreateDomain(
"MyApplication",
AppDomain.CurrentDomain.Evidence,
setup);
// Start MyApplication by executing the assembly:
domain.ExecuteAssembly(assembly);
// After the MyApplication has finished clean up:
AppDomain.Unload(domain);
}
}
}
您必须:
- 将
MyApplication.exe
替换为可执行程序集的名称 - 将
MyApplication
替换为应用程序的名称 - 将
MyApplication.exe.config
替换为应用程序配置文件的名称。如果你没有,那么你就不需要设置这个
您不需要创建单独的应用程序。您可以在主方法中生成子域,也可以根据AppDomain.CurrentDomain.IsDefaultAppDomain()
值调用实际的主方法:
public static void Main(string[] args)
{
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
// Loader
var entryPoint = System.Reflection.Assembly
.GetExecutingAssembly();
var applicationName = entryPoint.GetName().Name;
// Create the setup for the new domain:
var setup = new AppDomainSetup();
setup.ApplicationName = applicationName;
setup.ShadowCopyFiles = "true"; // note: it isn't a bool
// Create the application domain. The evidence of this
// running assembly is used for the new domain:
AppDomain domain = AppDomain.CreateDomain(
applicationName,
AppDomain.CurrentDomain.Evidence,
setup);
try
{
// Start MyApplication by executing the assembly:
domain.ExecuteAssembly(entryPoint.Location, args);
}
finally
{
// After the MyApplication has finished clean up:
AppDomain.Unload(domain);
}
}
else
{
// Main
ActualMain(args);
}
}
public static int ActualMain(string[] args)
{
//Hello-world!
}