17

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

4

5 回答 5

13

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

当且仅当程序集版本没有更改并且您没有使用强命名程序集时,您可以放入一个新的 DLL 作为替换。

如果版本确实发生了变化,那么您可能会收到运行时错误,因为您的程序尝试加载特定版本并获得与预期不同的版本。但是,如果没有更改方法签名,这可能会正常工作,但我不能保证并且总是建议重新编译。

当使用强命名程序集时,这甚至会成为一个更大的问题,因为强名称会同时编码程序集的版本和数字签名。因此,如果程序集中的任何代码发生了变化,那么即使版本没有变化,数字签名也会发生变化,因此强名称会发生​​变化。

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

总结一下:

  • 代码更改,没有版本更改和没有强名称 - 好的
  • 版本更改和没有强名称 - 可能需要重新编译,推荐
  • 代码更改和强命名 - 需要重新编译
  • 版本更改和强命名 - 需要重新编译
于 2012-12-06T20:30:42.373 回答
7

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

于 2012-12-06T20:21:27.170 回答
2

您只需确保项目的 dll 在Bar项目的 bin 中Foo。只要方法签名没有改变,你就很好。

于 2012-12-06T20:20:59.713 回答
2

关于引用的程序集被强命名的情况:假设 A 是任何程序集,B 是强命名程序集,并且 A 引用 B。那么(与上面的声明相反?)可以在改变 B 的内容的情况下重新编译 A。我刚刚尝试了这个,为 A 使用了一个简单的控制台应用程序,为 B 使用了一个类库。对强命名 B 的更改在 A 中没有导致运行时错误。但是有一个特殊情况:如果 B 从not-strongly-named 改为 strong-named,则需要重新编译 A,否则出现运行时错误。

于 2013-03-11T18:18:42.310 回答
1

不——您可以根据需要放入一个新的 DLL。只要新 DLL 不破坏任何旧功能,就无需重新构建引用项目。

于 2012-12-06T20:20:18.107 回答