当.NET程序集解析程序无法在运行时找到引用的程序集时(在这种情况下,它无法找到应用程序链接的特定包装DLL版本),其默认行为是失败并且实质上使应用程序崩溃.但是,可以通过挂钩AppDomain.AssemblyResolve事件来覆盖此行为.无论何时找不到引用的程序集,都会触发此事件,并且它使您有机会替换另一个程序集来代替缺少的程序集(前提是它们是兼容的).因此,例如,您可以替换自己加载的旧版本的包装器DLL.
我发现这样做的最好方法是在挂钩事件的应用程序的主类上添加一个静态构造函数,例如:
using System.Reflection; static Program() { AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e) { AssemblyName requestedName = new AssemblyName(e.Name); if (requestedName.Name == "Office11Wrapper") { // Put code here to load whatever version of the assembly you actually have return Assembly.LoadFile("Office11Wrapper.DLL"); } else { return null; } } }
通过将它放在主应用程序类的静态构造函数中,可以保证在任何代码尝试访问包装器DLL中的任何内容之前运行它,确保挂钩提前到位.
您还可以使用策略文件进行版本重定向,但这往往更复杂.
当.NET程序集解析程序无法在运行时找到引用的程序集时(在这种情况下,它无法找到应用程序链接的特定包装DLL版本),其默认行为是失败并且实质上使应用程序崩溃.但是,可以通过挂钩AppDomain.AssemblyResolve事件来覆盖此行为.无论何时找不到引用的程序集,都会触发此事件,并且它使您有机会替换另一个程序集来代替缺少的程序集(前提是它们是兼容的).因此,例如,您可以替换自己加载的旧版本的包装器DLL.
我发现这样做的最好方法是在挂钩事件的应用程序的主类上添加一个静态构造函数,例如:
using System.Reflection; static Program() { AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e) { AssemblyName requestedName = new AssemblyName(e.Name); if (requestedName.Name == "Office11Wrapper") { // Put code here to load whatever version of the assembly you actually have return Assembly.LoadFile("Office11Wrapper.DLL"); } else { return null; } } }
通过将它放在主应用程序类的静态构造函数中,可以保证在任何代码尝试访问包装器DLL中的任何内容之前运行它,确保挂钩提前到位.
您还可以使用策略文件进行版本重定向,但这往往更复杂.