如何确定Assembly.Load()搜索程序集的位置?

时间:2010-10-15 19:00:04

标签: c# .net reflection

我有一个VS加载项,它使用BinaryFormatter来反序列化对象。要解析此对象的类型,它调用Assembly.Load(objectTypeFullName),但它触发异常,因为Assembly.Load无法在其搜索的任何位置找到程序集。给定的程序集是加载项程序集的兄弟,但似乎Assembly.Load()在那里找不到它。

一种可能的解决方案是确定Assembly.Load应该在哪里寻找程序集。

我该怎么办?

PS:我正在尝试不将此程序集放在GAC上,因为每次重新编译程序集时都需要更新它。

3 个答案:

答案 0 :(得分:4)

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

另一种选择是订阅AppDomain.AssemblyResolve,以便在找不到程序集时覆盖行为。

答案 1 :(得分:4)

这是一段代码片段,展示了如何使用AssemblyResolve来解决你的程序集(根据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 Framework开始   版本4,   ResolveEventArgs.RequestingAssembly   property返回那个程序集   请求可能的装配负载   没有解决......

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

答案 2 :(得分:3)

如果您只是想确定程序集加载程序尝试加载dll的位置,我建议您打开Fusion日志。这样做将使您获得输出,该输出将显示为相应的dll检查的每个路径。

如何配置融合日志有MSDN articleSuzanne Cook有关如何调试加载失败的有用文章。如果打开LogFailures,则只能获得无法加载的程序集的输出。