【发布时间】:2012-02-07 08:40:57
【问题描述】:
我将一堆 DLL 的特定版本设置为 False,作为对 C# 控制台项目的引用。我知道这是编译时检查。
那么如何在运行时允许以前版本的 DLL?
谢谢!
【问题讨论】:
-
[AssemblyVersion] 数字可以深入了解团队合作的程度。如果主要版本号超过 3,或者您的内部版本或修订号非常随机,那么您遇到了版本号无法解决的通信问题。
我将一堆 DLL 的特定版本设置为 False,作为对 C# 控制台项目的引用。我知道这是编译时检查。
那么如何在运行时允许以前版本的 DLL?
谢谢!
【问题讨论】:
为了版本控制,运行时区分常规程序集和强名称程序集。版本检查仅适用于强名称程序集。
如果您确实有一个强名称程序集,您可以重定向对它的引用。见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。
【讨论】:
AssemblyResolve 手动找到它。我将添加一个示例。