动态加载程序集出现 System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。

7ero 2009-09-25 01:47:29
我做一个项目,要求运行时程序集都是从网上下载,并动态加载的。起初的时候一切正常,当程序集大了的时候,下载速度变慢,我就将程序集拆分成小块,并分块加载。这个时候问题出现了。

有两个程序集 A 和 B, B 引用 A,程序先加载 A,然后由 A 去加载 B,当加载 B 并遍历 B 中的类型的时候,则出现

System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。

的异常。

此时,如果 A 的 dll 文件,在应用程序目录中是没有问题的。但是设计要求是 A 的文件不能保存在本地,必须从网上下载,并由内存中加载,请问有什么方法能够解决这个问题么?
...全文
3044 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
csuchen6 2011-07-06
  • 打赏
  • 举报
回复
主要原因是你所需要通过反射载入的代码还依赖其他的代码,而你却没有提供(放入相关的文件夹)。比如A继承B,你需要载入A,却忘记复制B所在的dll去相关目录。所以只要把dll提供齐全就好了。

或者
1. 删除原来的dll
2. 重新生成dll
7ero 2009-09-25
  • 打赏
  • 举报
回复
捕获到更详细的异常是找不到 A 的文件。

其实就是 A 是在内存中加载的,根本就没有文件,能不能有别的办法让 B 在内存中查找 A?
wuyq11 2009-09-25
  • 打赏
  • 举报
回复
捕获ReflectionTypeLoadException ,查看更加详细的信息
跨程序集的反射
如果使用Type.GetType,只会在当前程序集中进行类型搜索
Assembly.LoadFile必须使用文件的绝对路径才行
CsToD 2009-09-25
  • 打赏
  • 举报
回复
你试试在AppDomain.AssemblyResolve事件里把已加载的A返回
边城的刀声 2009-09-25
  • 打赏
  • 举报
回复
作个下载程序集的类,再作个Loaded事件,当程序集加载完后触发。
然后用try catch 不断来判断是否已经下载下来,如果抛出异常,则继续等。
7ero 2009-09-25
  • 打赏
  • 举报
回复
如果不在GAC里注册能不能实现?就是程序集压根就不再磁盘上出现
hhhh63 2009-09-25
  • 打赏
  • 举报
回复
应该是线程同步问题吧,把共用的部份加一个锁试试
qin_wei 2009-09-25
  • 打赏
  • 举报
回复
用Assembly.LoadFrom(sFile);替换你的Assembly.LoadFile(string path);
threenewbee 2009-09-25
  • 打赏
  • 举报
回复
可以先下载下来,然后调用gacutil注册到GAC里面。
用Assembly.Load()加载程序集,然后再创建对象。

111,080

社区成员

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

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

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