参考DLL - 在运行时允许以前的版本

时间:2012-01-10 22:49:01

标签: c# dll reference version

对于一堆DLL,我将特定版本设置为False作为对C#控制台项目的引用。我知道这是一个编译时检查。

那么如何在运行时允许以前版本的DLL?

谢谢!

1 个答案:

答案 0 :(得分:5)

来自MSDN - Assembly Versioning

  

运行时为了版本控制而区分常规程序集和强名称程序集。仅对具有强名称的程序集进行版本检查。

如果您执行具有强名称程序集,则可以将引用重定向到它。请参阅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