【问题标题】:AssemblyResolve Event Handler vs. CodeBase policiesAssemblyResolve 事件处理程序与 CodeBase 策略
【发布时间】:2014-02-04 18:54:53
【问题描述】:

当尝试从 C# 程序集访问程序集时,有几种方法:

  1. 实现AssemblyResolve 事件处理程序 http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve(v=vs.110).aspx

  2. 使用 .config 文件中的属性重定向程序集请求

http://msdn.microsoft.com/en-us/library/system.resolveeventargs.name(v=vs.110).aspx 中对于(1) 中事件的ResolveEventArgs 属性所述:“Name 是应用策略之前的程序集名称。”

但是,我找不到有关这些方法顺序的任何文档。 在探测重定向之前是否调用了AssemblyResolve 事件处理程序?还是反过来?

其次,是否有可能以某种方式将该策略应用于ResolveEventArgs?例如从 .config 文件中请求重定向的版本范围?

【问题讨论】:

  • 当 CLR 找不到程序集时触发。所以在试探之后。

标签: c# .net appdomain assemblyresolve


【解决方案1】:

我在这里看到两个问题。如果我没有提供足够的信息,请纠正我。

  1. AssermblyResolve 事件仅在加载程序无法找到它正在寻找的程序集时才被调用。因此,首先探测程序集加载位置,然后如果未找到程序集,则调用 AssermblyResolve 事件。如果所有程序集都正确加载,AssemblyResolve 事件将不会触发。

  2. 可以手动将程序集加载到默认 AppDomain,如果这是您的意思。当程序集未正确加载并且AppDomain 中的AssemblyResolve 触发时,您可以手动解决它。

首先您附加到事件以获取加载程序集失败的通知

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

然后尝试从不同的地方加载替换程序集,具体取决于您的条件:

static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name == "ClassLibrary1, Version=2.0.0.0, Culture=neutral, PublicKeyToken=e261024fcc198a53")
        return Assembly.LoadFile("d:\\differentPath\\ClassLibrary1.dll");
    else
        return null;
}

据我所知,绑定重定向对于重定向到不同版本的程序集很有用,但不能将加载程序重定向到查找程序集的特定路径。

【讨论】:

  • 你说的完全正确。但是,MSDN 似乎有点不对劲。如果我使用绑定重定向重定向到不同的版本,AssemblyResolve 处理程序将使用重定向的版本调用,而不是原始版本。 (不过这实际上很适合我)
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多