我做一个项目,要求运行时程序集都是从网上下载,并动态加载的。起初的时候一切正常,当程序集大了的时候,下载速度变慢,我就将程序集拆分成小块,并分块加载。这个时候问题出现了。有两个程序集 A 和 B, B 引用 A,程序先加载 A,然后由 A 去加载 B,当加载 B 并遍历 B 中的类型的时候,则出现System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。的异常。此时,如果 A 的 dll 文件,在应用程序目录中是没有问题的。但是设计要求是 A 的文件不能保存在本地,必须从网上下载,并由内存中加载,请问有什么方法能够解决这个问题么?

解决方案 »

  1.   

    可以先下载下来,然后调用gacutil注册到GAC里面。
    用Assembly.Load()加载程序集,然后再创建对象。
      

  2.   

    如果不在GAC里注册能不能实现?就是程序集压根就不再磁盘上出现
      

  3.   

    作个下载程序集的类,再作个Loaded事件,当程序集加载完后触发。
    然后用try catch 不断来判断是否已经下载下来,如果抛出异常,则继续等。
      

  4.   

    你试试在AppDomain.AssemblyResolve事件里把已加载的A返回
      

  5.   

    捕获ReflectionTypeLoadException ,查看更加详细的信息
    跨程序集的反射
    如果使用Type.GetType,只会在当前程序集中进行类型搜索
    Assembly.LoadFile必须使用文件的绝对路径才行 
      

  6.   

    捕获到更详细的异常是找不到 A 的文件。其实就是 A 是在内存中加载的,根本就没有文件,能不能有别的办法让 B 在内存中查找 A?
      

  7.   

    用Assembly.LoadFrom(sFile);替换你的Assembly.LoadFile(string path);
      

  8.   

    主要原因是你所需要通过反射载入的代码还依赖其他的代码,而你却没有提供(放入相关的文件夹)。比如A继承B,你需要载入A,却忘记复制B所在的dll去相关目录。所以只要把dll提供齐全就好了。 或者
    1. 删除原来的dll
    2. 重新生成dll