对于一堆DLL,我将特定版本设置为False作为对C#控制台项目的引用。我知道这是一个编译时检查。
那么如何在运行时允许以前版本的DLL?
谢谢!
答案 0 :(得分:5)
运行时为了版本控制而区分常规程序集和强名称程序集。仅对具有强名称的程序集进行版本检查。
如果您执行具有强名称程序集,则可以将引用重定向到它。请参阅MSDN - Redirecting Assembly Versions。
在您的情况下,您可以使用AppDomain.AssemblyResolve
。这是一个例子:
AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) =>
{
var fullName = new AssemblyName(eventArgs.Name);
// should check that the assembly is the one we support old versions for
var wantedDLL = fullName.Name + ".dll";
// locate the DLL here... your path will vary
var found = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, wantedDLL));
return found;
};
或者,如果您知道确切的旧版本号,则可以使用Assembly.Load(AssemblyName)
重载加载它。
var fullName = new AssemblyName(eventArgs.Name)
{
Version = new Version(1, 0, 0, 0)
};
return Assembly.Load(fullName);
你也应该小心这里的错误。抛出异常会导致奇怪的行为,如果程序集无法加载,那么该方法将无限递归,从而导致StackOverflowException
。