原本直接加载Object obj = new Object();
MethodInfo mi = myc.GetType(DllPath, classNamespace, className, methodName, ref obj);
return (string)mi.Invoke(obj, args);
public MethodInfo GetType(string DllPath, string classNamespace, string className, string methodName, ref object obj)
{
Assembly ass = Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll //加载dll后,需要使用dll中某类.
Type type = ass.GetType(classNamespace + "." + className);//利用类型的命名空间和名称获得类型
//需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
obj = Activator.CreateInstance(type);//利用指定的参数实例话类型
return type.GetMethod(methodName);//通过方法名称获得方法
}使用域加载AppDomain ad = AppDomain.CreateDomain("DLL Unload test");
ProxyObject.ProxyObject obj = (ProxyObject.ProxyObject)ad.CreateInstanceFromAndUnwrap(System.AppDomain.CurrentDomain.BaseDirectory + "bin\\ProxyObject.dll", "ProxyObject.ProxyObject");
return obj.Invoke(DllPath, classNamespace, className, methodName, args);namespace ProxyObject
{
[Serializable]
public class ProxyObject : MarshalByRefObject
{ public string Invoke(string DllPath, string classNamespace, string className,string methodName, object[] args)
{
Object obj = new Object();
Assembly ass = Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
//加载dll后,需要使用dll中某类.
Type type = ass.GetType(classNamespace + "." + className);//利用类型的命名空间和名称获得类型
//需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
obj = Activator.CreateInstance(type);//利用指定的参数实例话类型
MethodInfo mi= type.GetMethod(methodName);//通过方法名称获得方法
return (string)mi.Invoke(obj, args);//报错 用的目标发生了异常。TargetInvocationException }
}
}出于需要卸载DLL 使用域后,函数调用时出错
有人知道错在哪,或者给个例子
MethodInfo mi = myc.GetType(DllPath, classNamespace, className, methodName, ref obj);
return (string)mi.Invoke(obj, args);
public MethodInfo GetType(string DllPath, string classNamespace, string className, string methodName, ref object obj)
{
Assembly ass = Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll //加载dll后,需要使用dll中某类.
Type type = ass.GetType(classNamespace + "." + className);//利用类型的命名空间和名称获得类型
//需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
obj = Activator.CreateInstance(type);//利用指定的参数实例话类型
return type.GetMethod(methodName);//通过方法名称获得方法
}使用域加载AppDomain ad = AppDomain.CreateDomain("DLL Unload test");
ProxyObject.ProxyObject obj = (ProxyObject.ProxyObject)ad.CreateInstanceFromAndUnwrap(System.AppDomain.CurrentDomain.BaseDirectory + "bin\\ProxyObject.dll", "ProxyObject.ProxyObject");
return obj.Invoke(DllPath, classNamespace, className, methodName, args);namespace ProxyObject
{
[Serializable]
public class ProxyObject : MarshalByRefObject
{ public string Invoke(string DllPath, string classNamespace, string className,string methodName, object[] args)
{
Object obj = new Object();
Assembly ass = Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
//加载dll后,需要使用dll中某类.
Type type = ass.GetType(classNamespace + "." + className);//利用类型的命名空间和名称获得类型
//需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
obj = Activator.CreateInstance(type);//利用指定的参数实例话类型
MethodInfo mi= type.GetMethod(methodName);//通过方法名称获得方法
return (string)mi.Invoke(obj, args);//报错 用的目标发生了异常。TargetInvocationException }
}
}出于需要卸载DLL 使用域后,函数调用时出错
有人知道错在哪,或者给个例子
解决方案 »
- 未将对象引用设置到对象的实例?
- panel滚动条,奇怪。
- 如何从数据库中得到单一的值并将值写入文本框
- datagrid下边的空白大家怎么解决的。单元格以外.另外有好的编辑办法吗
- 对话框的问题???请高手指教!!!
- 谁能给我一给。net中特效广告的代码
- WebClient DownloadFileAsync 不触发DownloadProgressChanged事件?
- 怎么把图片放置在当前文件夹中
- 怎么让“解决方案”中的所有项目都重新编译呀!
- 求助大神亿美*通的那个短信平台怎么接入啊??不是广告
- 求:RSS订阅到Google,Yahoo,qq邮箱的接口源码
- C#开发软件这个按钮如何变成这样?写什么样式..
其实本质和我写的一样,就是想写成一个插件进而可以热拔插
问题找到了,总结一下1.return (string)mi.Invoke(obj, args);//报错 用的目标发生了异常。TargetInvocationException
我的报错主要是因为,我在外部DLL又引用了本项目的DLL,,
使用域的时候,需要把引用到的全部COPY(本项目就有重复的DLL!)
不使用域,直接使用反射,就不需要COPY
2.修改后,再次出现问题,使用域后,引用到的DLL直接被调用时,提示未实例化,我是这样理解的,我新建域后,直接调用这个域中的其他DLL,这些DLL并没有生成实例, 也有解决办法,就是当前域里所有DLL都初始化到新建域(水平有限,这是另一个同事口述)我现在的解决办法是,根本不需要域,加载DLL直接从内存中加载,而不是从文件中
结贴