请教大神,关于C#动态加载Dll,怎么实现异步返回的问题

rokky 2014-10-11 03:15:50
现在遇到一个问题,就是在程序运行时动态加载DLL,这个已经实现了

Assembly assembly=Assembly.LoadFrom(DllPath);

Type type=ass.GetType("TypeName");

Object obj = Activator.CreateInstance(type,params[]);

MethodInfo mi=type.GetMethod(“MehtodName”);

mi.Invoke(obj,params[])

但是这样加载的Dll,在程序运行的时候,会造成阻塞,怎么实现异步动态调用DLL呢。
...全文
354 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
rokky 2014-10-13
  • 打赏
  • 举报
回复
对的。确实是,我把目标框架改为4.0 就对了。晕
effun 2014-10-13
  • 打赏
  • 举报
回复
引用 19 楼 rokky 的回复:
那么,现在问题来了。我把他放在子线程中执行。程序提示这个呢。Could not load file or assembly 'file:///F:\Csharptest\DSDLL\test\ConsoleApplication2\ConsoleApplication2\bin\Debug\test.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
DLL是用4.0编的,而你的程序是2.0
rokky 2014-10-13
  • 打赏
  • 举报
回复
那么,现在问题来了。我把他放在子线程中执行。程序提示这个呢。Could not load file or assembly 'file:///F:\Csharptest\DSDLL\test\ConsoleApplication2\ConsoleApplication2\bin\Debug\test.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
rokky 2014-10-13
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Data.SqlClient; using System.Threading; namespace testLoadDll { class Program { static void Main(string[] args) { test obj = new test(); obj.dllName = "ChinaMobil.dll"; obj.nsName = "ChinaMobil"; obj.ClsName = "MainMode"; obj.MethodName = "GetMobilInfo"; obj.Par = "000000000000000000000000000 "; obj.SQLconn = new SqlConnection(string.Format("server={0};uid={1};pwd={2};database={3}", "192.168.0.1", "sa", "xxxx", "xxxx")); Thread th = new Thread(new ThreadStart(obj.ThreadMethod)); th.Start(); th.Join(); Console.Write(obj.ReturnVal); Console.ReadLine(); } } class test { public string dllName = ""; public string nsName = ""; public string ClsName = ""; public string MethodName = ""; public string Par = ""; public SqlConnection SQLconn = null; public string ReturnVal = ""; private string GetRet(string dllName, string nsName, string ClsName, string methodName, string Par, SqlConnection SQLConn) { try { Assembly ass = Assembly.LoadFrom(dllName); Type t = ass.GetType(nsName + "." + ClsName); object obj = Activator.CreateInstance(t); MethodInfo method = t.GetMethod(methodName); string tmp = ""; tmp = method.Invoke(obj, new object[] { Par, SQLConn }).ToString(); return tmp; } catch (Exception ex) { return "fail:" + "dll调用出错;" + ex.Message + nsName + "." + ClsName; } } public void ThreadMethod() { ReturnVal = GetRet(dllName, nsName, ClsName, MethodName, Par, SQLconn); } } }
rokky 2014-10-13
  • 打赏
  • 举报
回复
那么,现在问题来了。我把他放在子线程中执行。程序提示这个呢。Could not load file or assembly 'file:///F:\Csharptest\DS DLL\test\ConsoleApplication2\ConsoleApplication2\bin\Debug\test.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
  • 打赏
  • 举报
回复
引用 楼主 rokky 的回复:
现在遇到一个问题,就是在程序运行时动态加载DLL,这个已经实现了 Assembly assembly=Assembly.LoadFrom(DllPath); Type type=ass.GetType("TypeName"); Object obj = Activator.CreateInstance(type,params[]); MethodInfo mi=type.GetMethod(“MehtodName”); mi.Invoke(obj,params[]) 但是这样加载的Dll,在程序运行的时候,会造成阻塞,怎么实现异步动态调用DLL呢。
首先,你的最后一条代码并没有使用“返回值”啊?!如果没有,就纠结不到什么问题,直接把它放在子线程中执行。如果需要返回值,那么参考这个贴子的设计思想:http://bbs.csdn.net/topics/390900344
rokky 2014-10-11
  • 打赏
  • 举报
回复
就是加载完成后,执行dll里方法的时候,会阻塞,因为dll里的方法会去完成一个网络请求。怎样在线程里执行,执行完后,怎样获取返回的结果(Dll执行完后,有返回的string),没玩过啊。
於黾 2014-10-11
  • 打赏
  • 举报
回复
或者你把加载dll并执行代码的整个过程都封装到类里去 然后实例化类之后,以线程的方式执行,执行完给个回调函数通知主线程后续处理
於黾 2014-10-11
  • 打赏
  • 举报
回复
造成阻塞?加载个dll而已,能加载多长时间,怎么会阻塞? 如果是加载完dll,执行里面的方法过慢,把函数扔线程里执行
gw6328 2014-10-11
  • 打赏
  • 举报
回复
从你这段代码来看,你后面代码要用到ass所以用异步不能解决你的问题反而会出错。 必须加载完了才能处理后面的操作。
rokky 2014-10-11
  • 打赏
  • 举报
回复
引用 9 楼 FoxDave 的回复:
好吧 是没有 看这个
正在学习中。。。
rokky 2014-10-11
  • 打赏
  • 举报
回复
引用 7 楼 gxingmin 的回复:
有什么好惊讶的,异步你自己来处理,你放在后台线程里来动态调用dll,把返回的数据在更新的ui线程上
我是惊讶拷贝副本那个方法
Justin-Liu 2014-10-11
  • 打赏
  • 举报
回复
好吧 是没有 看这个
Justin-Liu 2014-10-11
  • 打赏
  • 举报
回复
异步啊!没用过begininvoke吗?
gxingmin 2014-10-11
  • 打赏
  • 举报
回复
有什么好惊讶的,异步你自己来处理,你放在后台线程里来动态调用dll,把返回的数据在更新的ui线程上
rokky 2014-10-11
  • 打赏
  • 举报
回复
线程里执行的话,返回值是个问题了
rokky 2014-10-11
  • 打赏
  • 举报
回复
gxingmin 2014-10-11
  • 打赏
  • 举报
回复
把上面的代码放到线程里执行
  • 打赏
  • 举报
回复
没整过,笨办法:拷贝个副本2 加载拷贝的那个
rokky 2014-10-11
  • 打赏
  • 举报
回复
关键是动态加载的。如果不是动态加载都很好解决的。
加载更多回复(1)

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧