2011-07-25 28 views
0

我有以下情況。有n個文件夾,每個包含兩個組件:C#反射,AppDomain:從不同的文件夾執行相同的程序集

Assembly1.dllAssembly2.dll

  • 所有Assembly1.dll的是完全一樣的

  • 所有Assembly2.dll的彼此略有不同,但具有相同的類別/方法。

  • 所有Assembly1.dll的參考Assembly2.dll

在我的計劃,我想裏面創建Assembly1一些類的實例,並調用這個類的一個方法:

for(int i = 0; i < 100; i++) 
{ 
    Assembly myAssembly1 = Assembly.LoadFrom("Directory"+ i + "\\Assembly1.dll"); 
    Type myType = myAssembly1.GetType("MyClass"); 

    object myObject = Activator.CreateInstance(myType); 
    myType.Invoke(myMethodName, BindingFlags.InvokeMethod, null, myObject, null); 
} 

這段代碼被執行的每個文件夾包含一個Assembly1.dll 問題是,第一個工作正常,但此後Assembly2.dll已被加載,不會重新加載。但是,它需要被當前文件夾(編號i)內的文件替換。這是因爲它略有不同。

在我每次調用上面這段代碼時,都會採用相同的assembly2。

我已經搜索了類似的問題,並且發現了一些關於使用自定義AppDomains的建議。我試過這個,但是我無法讓它正常工作。

有人可以給出一個代碼示例如何初始化一個新的AppDomain並在這個新的域內執行上述代碼(以便引用的Assembly2.dll將被正確加載和卸載)?

還是有人有不同的想法如何解決這個問題?

最良好的祝願, 基督教

+0

請將解決方案轉換爲單獨的答案並標記爲正確。 –

回答

0

我終於搞定了。對於所有人都有同樣的問題,這是解決方案:

AppDomain myDomain = AppDomain.CreateDomain("MyDomain"); 

string pathToTheDll = "C:\\SomePath\\MyAssembly1.dll"; 
object obj = myDomain.CreateInstanceFromAndUnwrap(pathToTheDll, "MyAssembly1.TypeName"); 
Type myType = obj.GetType(); 

myType.InvokeMember("SomeMethodName", BindingFlags.InvokeMethod, null, obj, null); 

AppDomain.Unload(myDomain); 

我希望這可以幫助別人!

1

檢查這個http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspxhttp://msdn.microsoft.com/en-us/library/ff527268.aspx了...你可以創建AppDomains,負載assembly1並指定AssamblyResolve Event處理程序,你可以給它正確的Assembly2 ... 看到Can I specify dependency directories when dynamically loading assemblies?

+0

感謝您的鏈接,我會直接閱讀並嘗試一下。 – Christian

+0

嗯我仍然堅持在同一點。我可以在第一次迭代中加載這些程序集,但之後我無法擺脫它們。我需要加載正確版本的Assembly2.dll。我成功地將程序集加載到新的AppDomain中,我也成功地卸載了AppDomain(並且程序集在「Modules」下消失),但是如何在這個新的AppDomain中創建一個類的實例? – Christian

相關問題