AssemblyResolve事件处理程序与CodeBase策略

时间:2014-02-04 18:54:53

标签: c# .net appdomain assemblyresolve

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

    仅当loader没有设法找到它正在查找的程序集时,才会调用
  1. AssermblyResolve事件。因此,探测第一个装配加载位置,然后如果未找到装配,则调用AssermblyResolve事件。如果所有程序集都已正确加载,AssemblyResolve事件将根本不会触发。

  2. 如果这是你的意思,可以手动将程序集加载到默认AppDomain。如果装配无法正确加载,AssemblyResolve AppDomain点火,您就有机会手动解决。

  3. 首先,您附加到事件以获知加载程序集失败

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

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