2012-01-14 114 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