使用Reflection在同一程序集的不同版本中使用类对象

时间:2012-01-14 17:31:36

标签: c# reflection c#-3.0 reflection.emit

我需要加载不同版本的程序集(我的应用程序中已经有相同名称的程序集)。

我能够加载程序集并加载我需要使用反射调用的方法但是当我通过传递我的类对象作为参数来调用方法时,我得到了类对象无法转换为类型的异常参数参数。

示例代码 -

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 });

此处参数是我在汇编中具有的类的对象,但由于参数类是在当前版本的程序集中创建的。当我尝试将它传递给前一个程序集的方法时,我得到一个例外,它无法转换。

我怎样才能做到这一点?如果我需要在这里提供更多信息,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您应该查看托管扩展性框架(MEF)。它使您可以更轻松地完成您想做的事情,并使您不必担心AppDomains和不同的程序集。

修改

如果您希望仅使用反射来实现您想要的效果,则需要在您的应用程序中使用灵活的对象模型。这种方法的基础是MEF在引擎盖下做的事情。你真正掌握权力的地方来自.Net远程处理,所以我建议你仔细阅读。

你需要什么:

  • 您在(程序集A)中的申请。

  • 使用旧类代码(程序集C)进行汇编。

  • Remote Loader类,它将充当第二个AppDomain的代理/远程。

  • 代表旧类版本实例的代理类。

  • 程序集B,它将包含您的代理类和远程加载程序。

以下是您可以尝试的内容:

  1. 从装配A加载应用程序。

  2. 创建新的AppDomain实例。

  3. 在程序集B的新AppDomain中实例化“Remote Loader”类的实例。

    一个。这将导致程序集B加载到AppDomain中。

  4. 从“Remote Loader”中,加载程序集C并实例化旧类,然后将代理类的实例传回原始AppDomain。

  5. 现在希望您可以修改您的方法以接受代理和您的新类版本都可以实现的对象的更通用版本(可能是接口?)。