了解.NET 1.1与.NET 3.5中的DLL版本控制

时间:2010-07-28 15:42:04

标签: .net versioning

在.NET 1.1与.NET 3.5中,dll版本控制的实现方式是否有所不同?我似乎可以在使用.NET 1.1的已部署应用程序中混合使用新旧版本的依赖dll,但在部署的.NET 3.5应用程序中运行与dll匹配时,会导致问题。

3 个答案:

答案 0 :(得分:3)

很多这是基于可以在您的引用上设置的“useSpecificVersion”属性决定的。一般的经验法则是,您可以使用引用的DLL的NEWER版本,而不是旧版本。

如果将“UseSpecificVersion”设置为true,则会强制应用程序使用该版本,并且仅强制使用该引用的DLL版本。这是一直在.NET中的一个功能。

使用特定版本示例

如果您使用引用程序集Y的版本01.01.00.00构建dll X.使用程序集Y的01.01.00.00之外的版本将导致失败。

标准示例

如果您使用引用程序集Y的版本01.01.00.00构建dll X,则可以使用版本01.01.00.00或更高版本而不会出现问题。

  • 01.01.00.00 - 作品
  • 01.01.01.00 - 作品
  • 01.05.00.00 - 作品
  • 01.00.01.00 - 失败,因为它是以前的版本。

答案 1 :(得分:0)

我认为它并没有真正改变,但你可以read about it in MSDN

您不能混用旧版本和新版本,因为旧版本会出现问题。

说你有:

abc.exe 1.0,也引用了XYZ.DLL和ZZZ.DLL 1.0。

如果你重新编译ZZZ.DLL并使其成为1.1,abc.exe应该继续工作,如果它存在于它的加载路径中,它将加载DLL。

但是,如果您复制ZZZ.DLL v0.9,abc.exe将失败加载该dll,因为它已经过时了。

请记住,如果XYZ.DLL也引用了ZZZ.DLL,则适用相同的规则。

另一方面,您始终可以在GAC中安装DLLS并提供不同的版本。这样,当您加载程序集时,如果它在GAC中,.NET将尝试找到“正确的”,但会回退到它可以使用的任何内容,只要它是更高的版本。

答案 2 :(得分:0)

也许我误解了Mitchel Seller的回应,但似乎对'useSpecificVersion'的含义做出了错误的假设。我通过一些简单的测试更新了我的记忆,但他们的目标是.net 3.5,因为我无法在VS2010中定位1.1。

似乎人们认为通过在Visual Studio的属性网格中设置'useSpecificVersion',.net RUNTIME将允许用更新的程序集版本替换DLL ...这是不正确的。

没有(排除自定义程序集绑定)将改变这样一个事实:如果你的'依赖'被强名称,_that_exact_version_必须在运行时出现在应用程序中,否则你将收到与assembly-not-found / type-load相关的异常-exception。

“useSpecificVersion”纯粹是一个编译时选项。它允许Visual Studio替换给定的DLL,以确保它可以解析引用以获得成功的编译。它被大量用于Visual Studio的多目标功能。

只是给你一个简单的例子......

注意如果你添加一个项目引用到某个DLL,你没有在属性网格中获得'useSpecificVersion'选项 - 这是因为你已经指定了一个显式项目。 但是,如果您从“添加引用”对话框添加引用,那么您所说的是“添加一些已安装产品”提供的引用。然后你可以选择将“useSpecificVersion”设置为false。

让我们假装您已经通过MSI安装了NLog 1.0,并且已经将NLog.dll放入了“添加引用”对话框(这是通过注册表项完成的)。 如果你将'useSpecificVersion'设置为False,那么你卸载NLog.msi(版本1.0)从你的硬盘驱动器中删除DLL,Visual Studio会抱怨片刻,在引用上放一个感叹号(你必须清理你的虽然项目,或VS将只从您的构建文件夹中获取DLL)。 但是,因为引用已使用“useSpecificVersion false”保存到项目文件中,如果您随后安装NLog.msi(版本2.0)...并重建(您可能需要重新启动VS),Visual Studio将找到版本2 NLog dll,并且非常满意使用它 - 小的黄色感叹号将消失。 这适用于两个方向,从较高版本号到较低版本,从较低版本到较低版本。 将“useSpecificVersion”保留为“True”将阻止Visual Studio执行此替换。

正如您所看到的,此行为与运行时实际发生的事情无关...... .NET仍然期望EXACT版本(除非您在app.config中配置了一些程序集版本重定向)它已编译对

将“useSpecificVersion”保持为“True”将确保开发人员必须在其系统上安装正确版本的依赖库才能成功构建。

我们使用DevExpress库,其中较新版本经常发布,我们永远不会在其引用上使用“useSpecificVersion False”,因为我们需要确保每个开发人员在工作时都安装了正确版本的DevExpress产品。如果没有这个,他们可能会无意中开始使用已经弃用的DevExpress功能(通过安装旧版本),或者尚未在我们实际打算部署的版本中引入(通过使用更新的版本)。