1

尝试从 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 属性:“名称是应用策略之前的程序集名称。”

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

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

4

1 回答 1

2

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

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

  2. AppDomain如果这是您的意思,可以手动将程序集加载为默认值。当程序集没有正确加载并且AssemblyResolve发生AppDomain火灾时,您有机会手动解决它。

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

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;
}

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

于 2014-02-04T19:58:02.043 回答