2010-06-04 67 views
2

我有一个.NET 4.0项目(C#)的解决方案,它生成一个延迟签名的dll,我对它进行了模糊处理和签名。引用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:“富”:符号到 左侧的“::”必须是一个类型

一旦我改变了引用,这些就解决了。

如何让引用忽略内部版本号甚至整个版本号?

回答

5

C#IDE有一个选项“Specific Version = False”。在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即可辞职。

+0

+1。谢谢。我已经编辑了我的问题,包括我编译程序集的方式,并提及它在构建中的缺陷,而不是VS2010中的错误。我希望每个版本都能创建一个新版本,这只能使用[AssemblyVersion]而不是[AssemblyFileVersion]来完成。我不应该在[AssemblyVersion]中使用“*”吗? – brickner 2010-06-04 17:47:43

+0

是的,在[AssemblyVersion]中使用*会导致问题。 – 2010-06-04 17:52:25

+0

谢谢@Hans Passant。顺便说一下,的确,我不必拖延签名。但是如果我不这样做,我会收到警告。警告810100b3:...是强名称签署的程序集,嵌入清单会使签名无效。您需要重新签署此文件以使其成为有效的程序集。 – brickner 2010-06-04 17:54:21