我需要加载不同版本的程序集(我的应用程序中已经有了相同名称的程序集)。
我能够加载程序集并加载需要使用反射调用的方法,但当我通过将类对象作为参数传递来调用该方法时,我得到了一个异常,即类对象无法转换为参数类型。
示例代码-
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,它将包含您的代理类和远程加载程序。
以下是您可以尝试的:
-
从组件A.加载应用程序
-
创建新的AppDomain实例。
-
实例化您的";远程加载器";类。
a。这将导致程序集B加载到AppDomain中。
-
从您的";"远程加载器";,加载程序集C并实例化旧类,然后将代理类的一个实例传递回原始AppDomain。
-
现在,希望您可以修改您的方法,以接受代理和新类版本都可以实现的对象的更通用版本(可能是接口?)。