当前位置:  开发笔记 > Android > 正文

使用Assembly.LoadFrom和Assembly.Load混合加载程序集时的奇怪行为

如何解决《使用Assembly.LoadFrom和Assembly.Load混合加载程序集时的奇怪行为》经验,为你挑选了2个好方法。

使用Assembly.LoadFrom和Assembly.Load混合加载程序集时的奇怪行为

使用Assembly.LoadFrom以及稍后使用Assembly.Load加载程序集时,我遇到了一种奇怪的行为.
我正在使用Assembly.LoadFrom加载程序集,其中程序集位于不是执行文件夹的文件夹中.

稍后在我的测试代码中,当我尝试使用Assembly.Load再次加载此程序集时,加载失败并出现System.IO.FileNotFoundException("无法加载文件或程序集......"),尽管程序集已经加载.使用强名称和非强名称加载失败(再次加载此装配的原始原因是使用BinaryFormatter).

但是,如果程序集位于执行文件夹中,则后两次加载在两种情况下都会成功,具有强名称和非强名称.在这种情况下,您可以看到两个相同的装配从两个不同的位置加载.

一个重新创建此问题的简单代码示例 -

程序集assembly1 = Assembly.LoadFrom(@"C:\ a.dll");

//使用强名称加载失败程序集assembly2 = Assembly.Load(@"a,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 14986c3f172d1c2c");

//也加载非强大的失败程序集assembly3 = Assembly.Load(@"a");

    CLR忽略已经加载的程序集的任何解释?

    任何想法我怎样才能缓解这个问题?

谢谢.



1> Kent Boogaar..:

这并不奇怪.根据文档,使用Load和LoadFrom加载会将程序集放在不同的上下文中.这可能有所帮助.

    CLR忽略已经加载的程序集的任何解释?

因为他们处于不同的环境中.

    任何想法我怎样才能缓解这个问题?

从相同的上下文加载,或者帮助CLR找到程序集,可能是通过附加一个处理程序AppDomain.AssemblyResolve.

替代

如果您要从中加载程序集的位置是AppDomain.BaseDirectory下的子文件夹,则只需在App.config中添加一个条目:


   
      
         
      
   

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx



2> Hershi..:

@Kent Boogart:这似乎是正确的解释.要获得完整的解释,Suzanne Cook有一篇博文,其中详细介绍了您发布的原文:http: //blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

以下是利用AppDomain.AssemblyResolve的代码 -

 // register to listen to all assembly resolving attempts:
 AppDomain currentDomain = AppDomain.CurrentDomain;
 currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);


 // Check whether the desired assembly is already loaded
 private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    foreach (Assembly assembly in assemblies) {
       AssemblyName assemblyName = assembly.GetName();
       string desiredAssmebly = args.Name;
       if (assemblyName.FullName == desiredAssmebly) {
           return assembly;
       }
    }

    // Failed to find the desired assembly
    return null;
 }

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有