代码之家  ›  专栏  ›  技术社区  ›  Andre Pena

如何确定assembly.load()在何处搜索程序集?

  •  6
  • Andre Pena  · 技术社区  · 14 年前

    我有一个vs插件,它使用BinaryFormatter反序列化对象。若要解析此对象的类型,它正在调用assembly.load(objectTypeFullName),但它正在触发异常,因为assembly.load在其搜索的任何位置都找不到该程序集。给定的程序集是外接程序程序集的兄弟,但似乎assembly.load()在那里找不到它。

    可能的解决方案是确定程序集的位置。加载应查找程序集。

    我该怎么办?

    PS:我不想把这个程序集放到GAC上,因为每次我重新编译程序集时都需要更新它。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Reed Copsey    14 年前

    你可以使用 AppDomainSetup.PrivateBinPath 添加其他私人搜索路径。这可以通过 AppDomain.SetupInformation .

    另一个选择是订阅 AppDomain.AssemblyResolve 以便在无法找到程序集时重写行为。

        2
  •  4
  •   Hershi    14 年前

    下面是一段代码片段,说明如何使用assembly resolve解析程序集(根据Reed Copey的答案):

    // 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) {
        string desiredAssmebly = args.Name;
        if (desiredAssembly.Equals("NameUsedToLoadMyAssembly")){
            return Assembly.LoadFrom(myAssemblyPath);
        }
    
        return null;
      }
    

    另外,请注意,assemblyresolve的msdn页面声明:

    从.NET框架开始 版本4 resolveEventArgs.requestingassembly 属性返回的程序集 已请求可以 无法解决…

    如果知道程序集相对于请求程序集的位置,则可以使用此选项。

        3
  •  3
  •   adrianbanks    14 年前

    如果您只是想确定程序集加载程序试图从何处加载DLL,我建议您打开融合日志。这样做将使您能够获得输出,该输出将显示为相应的dll检查的每个路径。

    有一个 MSDN article 关于如何配置融合日志,以及一篇有用的文章 Suzanne Cook 关于如何调试加载失败。如果你打开 LogFailures 您应该只为未能加载的程序集获取输出。

    推荐文章