2012-01-14 113 views
5

在同一程序集的不同版本之間使用類對象我有加載不同版本的程序集的要求(我已經在我的應用程序中有相同名稱的程序集)。使用反射

我能夠加載程序集並加載我需要使用反射調用的方法,但是當我通過傳遞我的類對象作爲參數來調用方法時,我得到了類對象無法轉換爲類型的異常參數參數。

示例代碼 -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

這裏參數是一類我有在裝配但是由於參數類是在當前版本的組件創建的對象。當我嘗試將它傳遞給前一個程序集的方法時,我得到了一個無法轉換的異常。

我該如何做到這一點?如果我需要在此處提供更多信息,請告知我。提前致謝。

+0

我可能是錯的,但據我所知,加載不同版本的程序集需要另一個應用程序域。否則,將使用已經加載的版本。 – Vlad 2012-01-14 17:34:40

+0

不,我能夠在同一個應用程序域中加載程序集。唯一的問題是當我嘗試將在一個版本中創建的參數傳遞給其他人時。如果我嘗試使用反射在同一版本中創建對象的方法,它可以正常工作。 – 2012-01-14 17:42:10

+0

[在不同的程序集版本中傳遞類對象]的可能重複(http://stackoverflow.com/questions/8871079/passing-class -objects-across-different-assembly-versions) – 2012-01-15 19:32:50

回答

2

您應該查看託管擴展性框架(MEF)。它使得你想要做的事情變得更容易,並且使你不必擔心AppDomain和不同的程序集。

編輯:

如果您希望使用反射才達到你想要的東西,它會要求你的應用程序中的靈活對象模型。這種方法的基礎是MEF在引擎蓋下面做的。如果你真的有能力做到這一點,就是從.Net遠程處理,所以我建議你閱讀。

你需要什麼:

  • 你在(組件A)的應用程序。

  • 裝配舊的類代碼(裝配C)。

  • 將作爲您的代理/遠程第二個AppDomain的遠程裝載程序類。

  • 將代表舊版本類的實例的代理類。

  • 程序集B將包含您的代理類和遠程裝載程序。

這裏是你可以嘗試什麼:從組件A

    1. 加載應用程序創建新的AppDomain實例。

    2. 從裝配B.

      一個實例化在新的AppDomain的「遠程裝載程序」類的一個實例。這會導致程序集B被加載到AppDomain中。

    3. 從「Remote Loader」中加載程序集C並實例化舊類,然後將代理類的實例傳回原始AppDomain。

    4. 現在,希望您可以修改您的方法來接受代理和您的新類版本都可以實現的更通用的對象版本(可能是接口?)。

  • +0

    +1 ..謝謝,我會研究這個..但是現在不能將它與我的應用程序整合。有任何出路使用反射.. ?? – 2012-01-15 10:38:10

    +0

    我已經使用僅反射方法更新了它,但我建議您真的重新考慮要實現的目標,因爲這或多或少都是過度複雜的黑客攻擊。 – doogle 2012-01-15 19:10:42