我一直在编写这个程序(FOO
),它包含对 dll(BAR
)的引用。All BAR
contains 是执行各种不同计算的方法。 FOO
将能够在多台计算机上安装和部署。我的问题是,如果我在其中一种方法中更改公式(即更改x + y
为x - y
),我是否需要FOO
针对新方法进行重建BAR
?更重要的是,只部署新版本是否安全BAR
?
5 回答
@vcsjones 的评论在这里提出了一个重要的观点。
当且仅当程序集版本没有更改并且您没有使用强命名程序集时,您可以放入一个新的 DLL 作为替换。
如果版本确实发生了变化,那么您可能会收到运行时错误,因为您的程序尝试加载特定版本并获得与预期不同的版本。但是,如果没有更改方法签名,这可能会正常工作,但我不能保证并且总是建议重新编译。
当使用强命名程序集时,这甚至会成为一个更大的问题,因为强名称会同时编码程序集的版本和数字签名。因此,如果程序集中的任何代码发生了变化,那么即使版本没有变化,数字签名也会发生变化,因此强名称会发生变化。
同样,这将导致运行时错误,因为您的程序期望的强名称与程序集强名称不匹配。所以在这种情况下,总是需要重新编译。
总结一下:
- 代码更改,没有版本更改和没有强名称 - 好的
- 版本更改和没有强名称 - 可能需要重新编译,推荐
- 代码更改和强命名 - 需要重新编译
- 版本更改和强命名 - 需要重新编译
如果更改方法中包含的公式,则无需重新构建程序。但是,如果您通过更改调用参数来修改方法的签名,则需要重新构建程序。
您只需确保项目的 dll 在Bar
项目的 bin 中Foo
。只要方法签名没有改变,你就很好。
关于引用的程序集被强命名的情况:假设 A 是任何程序集,B 是强命名程序集,并且 A 引用 B。那么(与上面的声明相反?)可以在不改变 B 的内容的情况下重新编译 A。我刚刚尝试了这个,为 A 使用了一个简单的控制台应用程序,为 B 使用了一个类库。对强命名 B 的更改在 A 中没有导致运行时错误。但是有一个特殊情况:如果 B 从not-strongly-named 改为 strong-named,则需要重新编译 A,否则会出现运行时错误。
不——您可以根据需要放入一个新的 DLL。只要新 DLL 不破坏任何旧功能,就无需重新构建引用项目。