代码之家  ›  专栏  ›  技术社区  ›  Achilles

了解.NET1.1与.NET3.5中的DLL版本控制

  •  1
  • Achilles  · 技术社区  · 14 年前

    在.NET1.1和.NET3.5中,dll版本控制的实现是否不同?似乎我可以在使用.NET1.1的已部署应用程序中混合和匹配旧版本和新版本的依赖dll,但是在使用已部署的.NET3.5应用程序中混合匹配dll时会出现问题。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Mitchel Sellers    14 年前

    其中很多都是基于“useSpecificVersion”属性指定的,该属性可以在您的引用上设置。一般的经验法则是,可以使用引用的DLL的较新版本,而不是较旧版本。

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

    使用特定版本示例

    如果生成dll X时引用了引用程序集Y的版本01.01.00.00。使用非01.01.00.00版本的组件Y将导致故障。

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

    • 01.01.00.00-工程
    • 01.00.01.00-失败,因为它是以前的版本。
        2
  •  0
  •   Martin Marconcini    14 年前

    我不认为它真的改变了,但你可以 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将 失败

    请记住,如果XYZ.DLL也有对ZZZ.DLL的引用,那么同样的规则也适用。

        3
  •  0
  •   Adam    13 年前

    也许我误解了Mitchel Seller的回答,但它似乎对“useSpecificVersion”的含义做出了错误的假设。我已经通过一些简单的测试刷新了我的记忆,但是它们针对的是.NET3.5,因为我不能针对VS2010中的1.1。

    人们似乎相信,通过在VisualStudio的属性网格中设置“useSpecificVersion”,.net运行时将允许用较新的程序集版本替换DLL。。。这是不正确的。

    没有什么(自定义程序集绑定除外)会改变这样一个事实:如果您的“依赖项”是强名称,则在运行时必须向应用程序提供确切的版本,否则您将收到与程序集未找到/类型加载异常相关的异常。

    举个简单的例子。。。

    注意如果添加 项目 引用某个DLL时,在属性网格中无法获得“useSpecificVersion”选项—这是因为您指定了一个显式项目。 但是,如果您从“add References”对话框添加引用,那么您所说的是“add a reference that is supplied from some” 已安装产品 ". 然后您可以选择将“useSpecificVersion”设置为false。

    如果将“useSpecificVersion”设置为False,则卸载NLog.msi(版本1.0)将从硬盘中删除DLL,VisualStudio将在引用上加上感叹号(但必须清理项目,否则VS将从生成文件夹中获取DLL)。 这是双向的,从高版本号到低版本号,从低版本号到高版本号。

    如您所见,这种行为与运行时实际发生的事情无关。NET仍会期望编译它所依据的确切版本(除非您在app.config中配置了某些程序集版本重定向)。

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