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

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

样例代码-

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

这里参数是我在汇编中具有的类的对象,但是由于参数类是在当前版本的汇编中创建的。当我尝试将其传递给先前程序集的方法时,出现了一个无法转换的异常。

我怎样才能做到这一点?让我知道是否需要在这里输入更多信息。提前致谢。

最佳答案

您应该 checkout 托管扩展框架(MEF)。它使您想做的事情变得容易得多,并使您不必担心AppDomain和不同的程序集。
编辑:
如果仅希望使用反射来实现所需的功能,则需要在应用程序中使用灵活的对象模型。这种方法的基础是MEF在引擎盖下进行的操作。您真正有能力执行此操作的地方是.Net远程处理,因此建议您仔细阅读。
您需要什么:

  • 您的(程序集A)中的应用程序。
  • 具有旧类代码的程序集(程序集C)。
  • 一个Remote Loader类,它将用作您对第二个AppDomain的代理/远程。
  • 一个代理类,它将代表该类的旧版本的实例。
  • 程序集B,它将包含您的代理类和您的远程装载程序。

  • 您可以尝试以下方法:
  • 从程序集A加载应用程序。
  • 创建新的AppDomain实例。
  • 在程序集B中的新AppDomain中实例化“远程加载程序”类的实例。
    一种。这将导致程序集B加载到AppDomain中。
  • 从“远程加载程序”中加载程序集C并实例化您的旧类,然后将代理类的实例传递回原始AppDomain。
  • 现在希望您可以修改方法,以接受代理和新类版本均可实现的对象的更通用版本(可能是接口(interface)?)。
  • 10-06 05:54
    查看更多