如果我重新构建一个我的项目引用的dll,那么我是否也需要重新构建项目?

17
我一直在编写这个程序(FOO),其中包括对dll(BAR)的引用。 BAR 只包含执行各种不同计算方法的函数。 FOO 将能够安装和部署到多台计算机上。我的问题是,如果我更改其中一种方法中的公式(即将 x+y 更改为 x-y),我是否需要针对新的 BAR 重新构建 FOO?更重要的是,只部署新版本的 BAR 是否安全?

3
你们的程序集中有任何强名称吗?当你们构建它们时,程序集版本会改变吗? - vcsjones
所有程序集名称都不会更改。 - PiousVenom
5个回答

13

@vcsjones的评论提出了一个重要的观点。

如果程序集版本没有改变并且没有使用强名称程序集,你可以替换为新的DLL。

如果版本发生了变化,则可能会收到运行时错误,因为您的程序尝试加载特定版本但却得到了不同于其所期望的版本。如果没有更改方法签名,则此操作可能正常工作,但我不能保证,始终建议重新编译。

当使用强名称程序集时,这个问题更加严重,因为强名称编码了程序集的版本和数字签名。因此,即使版本没有更改,如果程序集中的任何代码已更改,则数字签名也将更改,从而强名称也会更改。

同样,这将导致运行时错误,因为程序期望的强名称将与程序集强名称不匹配。因此,在这种情况下,始终需要重新编译。

总结一下:

  • 代码更改,无版本更改和无强名称 - 可以
  • 版本更改和无强名称 - 可能需要重新编译,建议重新编译
  • 代码更改和强名称 - 需要重新编译
  • 版本更改和强名称 - 需要重新编译

2
以上是错误的。强命名程序集的目的是通过允许您指定新版本何时适合取代旧版本,从而实现对组件加载的细粒度控制。这可以在应用程序侧、组件侧或系统侧(由管理员)完成。例如,如果Bar的发布者推出了一个新的v1.5,则他们可以将其推送到所有使用v1.3-v1.4的应用程序(例如Foo)中,因为v1.5旨在作为这些应用程序的替代品(请谨慎使用!)请参见此处! - AnorZaken
我听过 Uncle Bob 的一次讲座,他说如果你的代码没有使用接口,而是直接从一个类依赖到另一个类,当你改变 B 类时,你就必须重新编译和部署 A 类(如果你使用接口则可以避免这种情况)。我想知道他是否指的是像你提到的强名称程序集这样的特定情况,还是可能存在其他情况? - BornToCode
如果引用程序集的程序集版本相同但文件版本已更改,我需要重新构建项目吗? - krish

7

如果您更改方法中包含的公式,无需重新构建程序。但是,如果您通过更改调用参数来修改方法的签名,则需要重新构建程序。


2

您只需要确保Bar项目的dll文件在Foo项目的bin目录中。只要方法签名没有改变,那就没问题了。


2

关于引用的程序集是强命名的情况:假设A是任意程序集,B是一个强命名程序集,并且A引用了B。那么(与上述声明相反?)可以在不重新编译A的情况下更改B的内容。我刚刚尝试了这个过程,使用了一个简单的控制台应用程序作为A和一个类库作为B。对强命名的B进行更改并没有在A中导致运行时错误。然而,有一种特殊情况:如果B从非强命名转变为强命名,则需要重新编译A,否则将会出现运行时错误。


1
不需要 - 您可以根据需要插入新的DLL。只要新的DLL不会破坏任何旧功能,就无需重新构建引用项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接