首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AssemblyResolve事件处理程序与CodeBase策略

AssemblyResolve事件处理程序与CodeBase策略
EN

Stack Overflow用户
提问于 2014-02-04 18:54:53
回答 1查看 840关注 0票数 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中对事件的ResolveEventArgs属性在(1)中指出的那样:“名称是应用策略之前的程序集名称。”

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-04 19:58:02

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

  1. 只有当加载程序无法找到它正在寻找的程序集时,才会调用AssermblyResolve事件。因此,首先探测程序集加载位置,然后如果找不到程序集,则调用AssermblyResolve事件。如果正确加载所有程序集,则AssemblyResolve事件将根本不会触发。
  2. 如果您的意思是手动加载程序集到默认的AppDomain,这是可能的。当程序集没有正确加载,并且AssemblyResolveAppDomain触发时,您就有机会手动解决它。

首先,您可以附加到事件中,以了解加载程序集已失败。

代码语言:javascript
复制
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

然后尝试从不同的位置加载替换程序集,这取决于您的标准:

代码语言:javascript
复制
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;
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21560954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档