尝试从C#程序集访问程序集时,有几种方法:
实现AssemblyResolve
事件处理程序
http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve(v=vs.110).aspx
使用.config文件中的属性重定向程序集请求
如http://msdn.microsoft.com/en-us/library/system.resolveeventargs.name(v=vs.110).aspx中所述,对于(1)中事件的ResolveEventArgs属性:“Name是应用策略之前的程序集名称。”
但是,我找不到任何有关这些方法顺序的文档。
是否在探测重定向之前调用AssemblyResolve
事件处理程序?或者反过来?
第二,是否有可能以某种方式将政策应用于ResolveEventArgs
?例如,从.config文件请求重定向的版本范围?
答案 0 :(得分:2)
我在这里看到两个问题。如果我没有提供足够的信息,请纠正我。
AssermblyResolve
事件。因此,探测第一个装配加载位置,然后如果未找到装配,则调用AssermblyResolve
事件。如果所有程序集都已正确加载,AssemblyResolve
事件将根本不会触发。
如果这是你的意思,可以手动将程序集加载到默认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;
}
据我所知,绑定重定向对于重定向到不同版本的程序集非常有用,但不能将加载程序重定向到查找程序集的特定路径。