Roh*_*ats 5 c# reflection reflection.emit c#-3.0
我需要加载不同版本的程序集(我的应用程序中已经有相同名称的程序集).
我能够加载程序集并加载我需要使用反射调用的方法但是当我通过传递我的类对象作为参数来调用方法时,我得到了类对象无法转换为参数类型参数的异常.
示例代码 -
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 });
Run Code Online (Sandbox Code Playgroud)
这里的参数是我在汇编中具有的类的对象,但是因为参数类是在当前版本的程序集中创建的.当我尝试将它传递给前一个程序集的方法时,我得到一个例外,它无法转换.
我怎样才能实现这一目标?如果我需要在这里提供更多信息,请告诉我.提前致谢.
您应该查看托管可扩展性框架 (MEF)。它使您更轻松地做您想做的事情,并使您不必担心 AppDomain 和不同的程序集。
编辑:
如果您只想使用反射来实现您想要的目的,则应用程序中需要灵活的对象模型。这种方法的基本原理就是 MEF 在幕后所做的事情。您真正能够做到这一点的地方是来自 .Net 远程处理,所以我建议您仔细阅读。
你需要什么:
您的申请(程序集 A)。
使用旧类代码的程序集(程序集 C)。
一个远程加载程序类,将充当第二个 AppDomain 的代理/远程。
代表旧版本类的实例的代理类。
程序集 B 将包含您的代理类和远程加载程序。
您可以尝试以下方法:
从程序集 A 加载应用程序。
创建新的 AppDomain 实例。
在程序集 B 的新 AppDomain 中实例化“Remote Loader”类的实例。
A。这将导致程序集 B 被加载到 AppDomain 中。
从“远程加载程序”中加载程序集 C 并实例化旧类,然后将代理类的实例传回原始 AppDomain。
现在希望您可以修改您的方法以接受代理和新类版本都可以实现的更通用的对象版本(可能是接口?)。
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |