2010-06-28 188 views
4

簡單的問題,可能很容易讓您回答。在另一個應用程序域加載獨立程序集

我在我的應用程序的同一輸出文件夾中有一個名爲「MigrationSteps.dll」的dll。 我想要做的是,將該程序集加載到新的AppDomain中,並在該DLL內部的類的實例上執行方法。

這裏是我的代碼

 string migrationStepsDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MigrationSteps.dll"); 
     AppDomainSetup appDomainSetup = new AppDomainSetup() { PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory }; 
     Evidence evidence = AppDomain.CurrentDomain.Evidence; 

     AppDomain appDomain = AppDomain.CreateDomain("MigrationAppDomain", evidence, appDomainSetup); 

//NOT WORKING 
     Assembly assembly = appDomain.Load(@"C:\Output\Debug\OptimeToolbench\MigrationSteps.dll"); 

     //WORKING 
     Assembly assembly = Assembly.LoadFrom(@"C:\Output\Debug\OptimeToolbench\MigrationSteps.dll"); ****works. 

     //This part works well 
     Type type = assembly.GetType("MigrationSteps.Foo"); 
     object foo = Activator.CreateInstance(type); 
     MethodInfo methodInfo = type.GetMethod("HelloWorld"); 
     methodInfo.Invoke(foo, null); 
     AppDomain.Unload(appDomain); 

每次行表示爲工作不拋出一個

FileNotFoundException異常

這是爲什麼?

感謝您的時間。

+0

你可以啓用Fusion記錄器,看看第一個在尋找什麼? – 2010-06-28 21:55:25

+0

這將不是必要的,解決方案就是答案。謝謝你的時間。 – esylvestre 2010-06-29 12:13:21

+0

只是想指出,此代碼將加載到主AppDomain中,並在應用程序的整個生命週期中鎖定目標程序集。爲了防止(並實際卸載目標),您需要創建一個動態加載的代理對象,動態加載目標(此代碼),最後再將可序列化的數據(如果需要的話)洗牌回調用應用程序。 – JoeBrockhaus 2014-12-05 21:24:19

回答

3

將「C:\ Output \ Debug \ OptimeToolbench \」添加到AppDomain的PrivateBinPath。也不要傳入文件名,傳入程序集名稱 - 我假設這將是MigrationSteps。

+1

已經完成(對於PrivateBinPath),請查看第2行。 但你也是對的,非常感謝你。 – esylvestre 2010-06-29 12:08:42

+0

哎呀,對不起人!但很高興你解決了它! – code4life 2010-06-29 13:09:24

3

appDomain.Load(string)需要一個程序集名稱(強名稱) - 不是磁盤上文件的路徑!

+0

+1。我想它會期望程序集的顯示名稱,它可能是或可能不是完整的強名稱 - 但你是正確的,它不會接受路徑。 – 2010-06-28 22:18:39

+0

沒錯,非常感謝。 需要給出code4life的答案,他先回答好答案。 – esylvestre 2010-06-29 12:10:53

+1

不用擔心 - 很高興你現在都準備好了! – 2010-06-29 15:56:46

相關問題