我有一个带有.NET 4.0项目(C#)的解决方案,它产生一个延迟签名的dll,我进行了点缀和签名。
编辑:这就是我对dll的版本:
[assembly: AssemblyVersion("0.7.0.*")]
[assembly: AssemblyFileVersion("0.7.0.0")]
我有一个.NET 4.0项目(C ++ / CLI)的另一个解决方案,它引用了签名的dll并生成了一个签名的dll(实际上,由于a flaw in the C++ build system而在后期构建中延迟签名和签名)。
问题是对dll的引用包含一个特定的版本号,甚至包括内部版本号(我想要一个内部版本号)。
每次构建引用的dll时,我都必须更改项目设置文件(.vcxproj),以便引用新版本的dll。由于我使用源代码控制,这非常不方便(不同的计算机可能有不同的构建号,因为每台计算机都构建自己引用的dll - 引用的dll不在源代码控制中)。
如果我不更改参考,我会收到警告:
警告MSB3245:无法解决 这个参考。无法找到 组件...
许多错误都是这样的:
错误C3083:'Foo':符号到 '::'的左边必须是一个类型
一旦我更改了引用,这些就解决了。
如何使引用忽略内部版本号甚至整个版本号?
答案 0 :(得分:5)
C#IDE有一个选项,“特定版本=假”。在C ++ / CLI IDE中不可用。坦率地说,这不是一个真正的问题。您可能错误地使用[AssemblyVersion]属性。该版本与程序集中公开可见的类相关联。如果您对这些类的公共成员进行任何更改,那么您可能会发生一个可能会发生重大变化,从而导致对这些类具有依赖性的代码失败。
在那一点你应该更改[AssemblyVersion]。任何使用程序集的项目都必须更新其引用程序集,并且必须重新编译。
一个非破坏性的更改,如错误修复或非可见类中的调整,会生成一个新文件,否则与使用它的任何项目完全兼容。您应该更新[AssemblyFileVersion]号码。在C ++ / CLI项目中需要更新非托管版本资源。更改相应的.rc文件可以自动执行,也可以使用#define。
请注意版本2.0中的.NET基本程序集的行为方式相同。他们的[AssemblyVersion]在3.0,3.5和3.5 SP1版本中保持在2.0.0.0。他们的文件版本从2.0.50727.42开始。并且在过去的5年中增加了很多倍,达到2.0.50727.4927,给予或接受。
为了记录,您链接的VS2010错误不是错误。它从来没有工作过,失败是沉默的。这是C ++构建系统中的一个缺陷,mt.exe在程序集强名后嵌入了清单。并在此过程中打破强名称,因为它会更改文件哈希值。 VS2010实际上是一种改进,它警告它,而不是默默地让一个破碎的强名称通过。您不必延迟签名,只能在后期构建事件中使用-Ra辞职。