在我们的商店中,我们使用Cruise Control和MSBuild来自动化构建产品作为持续集成的一部分。构建的一部分是对程序集进行签名,以使其具有强名称。在我们开发本地项目文件时,它并没有指定签名,因为这是由MSBuild脚本覆盖的。这一切都很好,直到我决定引入需要我使用"InternalsVisibleTo"属性的单元测试。我还开始使用一个很好的开源库,该库的单元测试也使用了这种技术。这意味着,在我的机器上,我可以更新AssemblyInfo.cs以使用以下语句:
我有点想不签名程序集就结束了。然而,“签名程序集是最佳实践”(重复这个口号3次),如果我们从中得到任何好处,我不想放弃它。
我们不安装到GAC,我们不特别关心篡改,不必担心使用我们库的第三方,我们更新应用程序时同时更新所有文件。最明显的好处是支持中的某个人不能将某个随机版本的程序集复制到运行时文件夹中,并使事情在短时间内似乎正常工作。
我不想打开涉及手动更改约100个项目文件以启用签名的问题。我也不想通过将应该是内部的东西标记为公共来破坏事情,我不想进入绑定重定向和我不想删除单元测试。
我希望具有无需强名称的所有便利性和具有强名称的所有好处(如果有的话),而且我不想创建很多额外的工作。这太过分了吗?
这篇文章很好地描述了问题和解决方案,但我不太擅长MSBuild脚本,无法充分利用它:
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")]
一切都很好。
然而,检查此内容会导致构建失败,因为构建机器会对程序集进行签名,该行需要更新为以下内容:
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests,
PublicKey="magic key here..)"]
我有点想不签名程序集就结束了。然而,“签名程序集是最佳实践”(重复这个口号3次),如果我们从中得到任何好处,我不想放弃它。
我们不安装到GAC,我们不特别关心篡改,不必担心使用我们库的第三方,我们更新应用程序时同时更新所有文件。最明显的好处是支持中的某个人不能将某个随机版本的程序集复制到运行时文件夹中,并使事情在短时间内似乎正常工作。
我不想打开涉及手动更改约100个项目文件以启用签名的问题。我也不想通过将应该是内部的东西标记为公共来破坏事情,我不想进入绑定重定向和我不想删除单元测试。
我希望具有无需强名称的所有便利性和具有强名称的所有好处(如果有的话),而且我不想创建很多额外的工作。这太过分了吗?
这篇文章很好地描述了问题和解决方案,但我不太擅长MSBuild脚本,无法充分利用它:
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/
这个问题的合适解决方案是什么?
欢迎任何意见和讨论。