C# AppDomain卷影副本包括引用的程序集

C# AppDomain卷影副本包括引用的程序集,c#,shadow-copy,C#,Shadow Copy,我是第一次尝试。我有以下代码: static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { var sApplicationDirectory = Application.StartupPath;

我是第一次尝试。我有以下代码:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

        var sApplicationDirectory = Application.StartupPath;
        var sAppName = "propane";

        AppDomainSetup oSetup = new AppDomainSetup();
        string sApplicationFile = null;

        // Use this to ensure that if the application is running when the user performs the update, that we don't run into file locking issues.
        oSetup.ShadowCopyFiles = "true";
        oSetup.ApplicationName = "MyApplication";

        // Generate the name of the DLL we are going to launch
        sApplicationFile = System.IO.Path.Combine(sApplicationDirectory, sAppName + ".exe");

        oSetup.ApplicationBase = sApplicationDirectory;
        oSetup.ConfigurationFile = sApplicationFile + ".config";
        oSetup.LoaderOptimization = LoaderOptimization.MultiDomain;

        // Launch the application
        AppDomain oAppDomain = AppDomain.CreateDomain(sAppName, AppDomain.CurrentDomain.Evidence, oSetup);
        oAppDomain.SetData("App", sAppName);
        oAppDomain.ExecuteAssembly(sApplicationFile);

        // When the launched application closes, close this application as well
        Application.Exit();

        //Application.EnableVisualStyles();
        //Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new Form1());
    }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
var sApplicationDirectory=Application.StartupPath;
var sAppName=“丙烷”;
AppDomainSetup oSetup=新建AppDomainSetup();
字符串sApplicationFile=null;
//使用此选项可确保如果用户执行更新时应用程序正在运行,则不会遇到文件锁定问题。
oSetup.ShadowCopyFiles=“true”;
oSetup.ApplicationName=“MyApplication”;
//生成要启动的DLL的名称
sApplicationFile=System.IO.Path.Combine(sApplicationDirectory,sAppName+“.exe”);
oSetup.ApplicationBase=sApplicationDirectory;
oSetup.ConfigurationFile=sApplicationFile+“.config”;
oSetup.LoaderOptimization=LoaderOptimization.MultiDomain;
//启动应用程序
AppDomain oAppDomain=AppDomain.CreateDomain(sAppName、AppDomain.CurrentDomain.Evidence、oSetup);
SetData(“App”,sAppName);
oAppDomain.ExecuteAssembly(sApplicationFile);
//当启动的应用程序关闭时,请同时关闭此应用程序
Application.Exit();
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(新Form1());
}
}
可执行文件正在到达temp目录,并且正在运行,直到我到达一个被引用的dll。我在整个项目中引用的14-16个DLL没有被复制到此临时目录,导致应用程序崩溃


我错过了什么?如何将它们全部复制到临时目录中?

我们的应用程序中几乎有相同的代码,而且运行良好

唯一不同的是,我们的主要方法也是装饰

[LoaderOptimization(LoaderOptimization.MultiDomain)]

您可以尝试一下,看看这是否有什么不同。

所有依赖项是否与sApplicationFile位于同一目录中?(不在子目录中)是的,它们与可执行文件在同一个目录中。我添加了这个,它没有复制引用。这是为你做的吗?实际上这一行已经包括在内:oSetup.LoaderOptimization=LoaderOptimization.MultiDomain;这只会影响appdomains之间的程序集共享,以防止再次JIT相同的代码。它与NGen映像更为相关,NGen映像可以跨进程共享,appdomains允许您跨进程共享相同的编译代码,而不会为相同内容的副本浪费物理内存。