2011-03-14 48 views
0

我通過將特定DLL的「Copy Local」設置爲false來觸發AssemblyResolve。 我的AssemblyResolve被觸發,我可以選擇我的DLL的位置。重新觸發程序集解決?

在後面的代碼中,我想AssemblyResolve重新觸發,所以我可以指定一個新的DLL位置,但由於從第一個AssemblyResolve DLL成功加載,我不能重新加載一個新的DLL。

有沒有一種方法可以清除當前的DLL並重新加載它?或類似的東西???

謝謝!

+0

你爲什麼要這麼做? – decyclone 2011-03-14 20:43:14

+0

我想通過加載每個DLL並從每個DLL獲取一些結果來比較某些開發和生產代碼的結果。如果有更好的方法來做到這一點,我對它很開放:) – sooprise 2011-03-14 20:44:35

+0

爲什麼不在一個新的AppDomain中加載程序集,處理結果,比較它們,並完成工作? – decyclone 2011-03-14 20:47:05

回答

3

您必須使用Assembly.LoadFile()來完成該操作。你不能用AssemblyResolve來完成,CLR會非常小心地避免重新加載程序集,因爲這會打開混合不同版本的同一個類的大門。有些方法是針對一個版本的,而另一些則針對另一個版本。如果沒有任何方法來保證,那麼歡鬧會隨之而來。

然而,LoadFile()卻是一種能夠以非常有創意和難以診斷的方式拍攝你的腳並在你的臉上冒出來的槍。一種喜悅是,當兩次加載時,完全相同的類型是不兼容的。你最好重新考慮一下。

+0

是的,你必須強調,這顯然是一個錯誤的情況......創建一個對象是純粹的快樂......但是,畢竟,我們已經做了一些非常糟糕的事情來測試系統嗎? – luckyluke 2011-03-14 21:23:05

0

你有可能想象在一個正在運行的程序中這麼做嗎?更重要的是爲什麼?程序集表示一些可執行代碼的工作版本。爲什麼你希望在相同的運行時間有替代的現實。我看不到目的,這可能表明一些設計缺陷?你可以在代碼中創建一個單獨的ApplicationDomain,然後用你想要的任何程序集重新加載你的應用程序。但爲什麼?

luke

+0

當然,這裏有一點背景:我試圖通過加載每個DLL並從每個DLL獲取一些結果來比較某些開發和生產代碼的結果。如果有更好的方法來做到這一點,我對它很開放:) – sooprise 2011-03-14 20:46:19

+1

爲什麼你的答案看起來像贖金?你想把電子開關切斷嗎? – jonathanpeppers 2011-03-14 20:47:14

+0

使用後期綁定(Assembly.Load)並指定不同的版本(即FULL的程序集名稱),然後處理程序集並加載另一個程序集,使用反射來實例化對象,但更好的方法是實際分離測試並通過比較結果編寫測試(單元或集成),並在不同的運行中運行.YOu實際上可以指定在app.config中加載哪個ddl。是否需要在同一運行時間內執行該操作? – luckyluke 2011-03-14 20:50:54

0

嘗試這樣的:

string dllFile = "C:\\sample.dll"; 
Assembly asmLoader = Assembly.LoadFile(dllFile); 
Type[] types = asmLoader.GetTypes(); 

由於從組件的所有資源不能被重新加載/更換而應用程序仍然是@運行 使用的LoadFile()。