使用反射在同一程序集的不同版本之间使用类对象



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

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

示例代码-

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

这里参数是我在程序集中拥有的类的对象,但由于参数类是在当前版本的程序集中创建的。当我试图将它传递给上一个程序集的方法时,我得到了一个无法转换的异常。

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

您应该查看托管扩展性框架(MEF)。它使你更容易做你想做的事情,并使你不必担心AppDomains和不同的程序集。

编辑:

如果您只想使用反射来实现您想要的目标,则需要在应用程序中使用灵活的对象模型。这种方法的基础是MEF在幕后所做的事情。你真正有能力做到这一点的地方是来自.Net远程处理,所以我建议你仔细阅读。

您需要什么:

  • 您在(程序集A)中的应用程序。

  • 具有旧类代码的程序集(程序集C)。

  • 一个远程加载器类,它将充当第二个AppDomain的代理/远程。

  • 一个代理类,它将表示类的旧版本的实例。

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

以下是您可以尝试的:

  1. 从组件A.加载应用程序

  2. 创建新的AppDomain实例。

  3. 实例化您的";远程加载器";类。

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

  4. 从您的";"远程加载器";,加载程序集C并实例化旧类,然后将代理类的一个实例传递回原始AppDomain。

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

相关内容

  • 没有找到相关文章

最新更新