【问题标题】:Reference DLL - Allow previous versions at run time参考 DLL - 在运行时允许以前的版本
【发布时间】:2012-02-07 08:40:57
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • [AssemblyVersion] 数字可以深入了解团队合作的程度。如果主要版本号超过 3,或者您的内部版本或修订号非常随机,那么您遇到了版本号无法解决的通信问题。

标签: c# dll reference version


【解决方案1】:

来自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

【讨论】:

  • 我已经尝试过重定向,但是这似乎不像我正在寻找的那样工作。我不得不说将 7.1.100 重定向到 7.0.150,但是其他只有 7.1.100 的机器呢 - 我只想让以前的版本工作。
  • 啊,我明白了。在这种情况下,我认为您唯一能做的就是使用AssemblyResolve 手动找到它。我将添加一个示例。
  • 非常感谢 - 我会试一试!
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 2011-01-22
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2015-07-08
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多