2011-12-14 31 views
2

我在第一次嘗試Shadow Copy。我有以下代碼:AppDomain影子複製包含引用的程序集

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()); 
    } 
} 

可執行在到達臨時目錄就好及其運行,直到我達到一個被引用的DLL。我在整個項目中引用的14-16個dll不會被複制到這個臨時目錄,導致應用程序崩潰。

我錯過了什麼?我如何將它們都複製到臨時目錄中?

+0

與sApplicationFile位於同一目錄中的所有依賴項是否都是? (不在子目錄中) –

+0

是的,它們與可執行文件位於同一目錄中。 – ErocM

回答

1

我們在應用程序中的代碼幾乎相同,並且效果很好。

唯一的區別是,我們的主要方法還裝飾有

[LoaderOptimization(LoaderOptimization.MultiDomain)] 

你可以試試,看它是否有差別。

+0

我加了這個,它沒有複製引用。是否適合你? – ErocM

+0

實際上這已經被覆蓋了這一行:oSetup.LoaderOptimization = LoaderOptimization.MultiDomain; – ErocM

+0

這隻會影響跨應用程序域的程序集共享,以防止再次運行相同的代碼。它與NGen映像更爲相關,可以跨進程和應用程序域共享這些映像,這使您可以跨進程共享相同的編譯代碼,而不會爲同一事物的副本浪費物理內存。 –

相關問題