【发布时间】:2014-04-20 03:50:07
【问题描述】:
在以下示例应用程序中,我创建了一个新的AppDomain,并在启用卷影复制的情况下执行它。然后从新的AppDomain 尝试删除(替换)原始的主 exe。但是我收到“访问被拒绝错误”。有趣的是,启动程序后,可以从 Windows 资源管理器重命名主 exe(但不能删除它)。
卷影复制能否用于运行时覆盖主 exe?
static void Main(string[] args)
{
// enable comments if you wanna try to overwrite the original exe (with a
// copy of itself made in the default AppDomain) instead of deleting it
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
Console.WriteLine("I'm the default domain");
System.Reflection.Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
string startupPath = currentAssembly.Location;
//if (!File.Exists(startupPath + ".copy"))
// File.Copy(startupPath, startupPath + ".copy");
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = Path.GetFileName(startupPath);
setup.ShadowCopyFiles = "true";
AppDomain domain = AppDomain.CreateDomain(setup.ApplicationName, AppDomain.CurrentDomain.Evidence, setup);
domain.SetData("APPPATH", startupPath);
domain.ExecuteAssembly(setup.ApplicationName, args);
return;
}
Console.WriteLine("I'm the created domain");
Console.WriteLine("Replacing main exe. Press any key to continue");
Console.ReadLine();
string mainExePath = (string)AppDomain.CurrentDomain.GetData("APPPATH");
//string copyPath = mainExePath + ".copy";
try
{
File.Delete(mainExePath );
//File.Copy(copyPath, mainExePath );
}
catch (Exception ex)
{
Console.WriteLine("Error! " + ex.Message);
Console.ReadLine();
return;
}
Console.WriteLine("Succesfull!");
Console.ReadLine();
}
【问题讨论】:
-
你想达到什么目的? 应该拒绝覆盖 exe,因为文件正在使用中。
-
是的,我想覆盖 exe。来自 MSDN:“影子复制允许在不卸载应用程序域的情况下更新应用程序域中使用的程序集”。这是否仅对 dll 有效,对 exe 无效?
-
卷影副本是相反的——先复制,然后运行副本,以便替换原件。来自 MSDN:“当应用程序域配置为卷影复制文件时,应用程序路径中的程序集被复制到另一个位置并从该位置加载。副本被锁定,但原始程序集文件被解锁并且可以更新。”了解您是在进行实验、尝试修改运行时行为还是尝试进行就地更新会很有帮助?还是别的什么?
-
我需要就地更新,并且我正在尝试完全按照 MSDN 中的报告进行操作,即我正在尝试运行副本而不是原始版本。我手动执行的副本只是为了尝试覆盖原始 exe 以证明原始 exe 未锁定。此手动副本与卷影副本无关,您甚至可以将其删除,然后尝试删除原始 exe(如果我正确理解卷影副本的目的)。一旦执行新的 AppDomain,就会创建卷影副本文件(自动在另一个目录中)。
-
看看 MEF - 你可以很容易地用它来热交换插件代码。更改正在运行的应用程序不会是您可以通过简单地更改源 exe 来完成的事情。看到这个问题:stackoverflow.com/questions/15232228/…
标签: c# appdomain shadow-copy