代码之家  ›  专栏  ›  技术社区  ›  brickner

引用dll时忽略内部版本号

  •  2
  • brickner  · 技术社区  · 15 年前

    我有一个带有.NET 4.0项目(C)的解决方案,它生成一个延迟签名的dll,我对它进行了融合和签名。

    编辑 :这是我版本DLL的方式:

    [assembly: AssemblyVersion("0.7.0.*")]
    [assembly: AssemblyFileVersion("0.7.0.0")]
    

    我有一个.NET 4项目(C++/CLI)的另一种解决方案,它引用已签名的DLL并生成一个签名的DLL(实际上,延迟签名并在后期生成中签名,因为 a flaw in the C++ build system )

    问题是对dll的引用包含一个特定的版本号,它甚至包括内部版本号(我想要一个内部版本号)。

    每次构建引用的dll时,我都必须更改项目设置文件(.vcxproj),以便它引用新版本的dll。因为我使用的是源代码管理,所以这非常不方便(不同的计算机可能有不同的内部版本号,因为每台计算机都构建自己的引用dll-引用的dll不在源代码管理中)。

    如果不更改引用,则会收到警告:

    警告:MSB3245:未能解析 此引用。找不到 装配…

    许多错误如下:

    错误C3083:“foo”:符号指向 “::”的左边必须是类型

    一旦我更改了引用,这些问题就解决了。

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

    1 回复  |  直到 15 年前
        1
  •  5
  •   Hans Passant    15 年前

    C IDE有一个选项可以选择“特定版本=假”。在C++/CLIDE中不可用。坦率地说,这不是真正的问题。您可能不正确地使用了[assemblyversion]属性。该版本与程序集中的公共可见类关联。如果您对这些类的公共成员进行了任何更改,那么您可能会得到一个破坏性的更改,这可能会使依赖于这些类的代码失败。

    AT 那一点 应该更改[assemblyversion]。并且任何使用该程序集的项目都必须更新其引用程序集并重新编译。

    另外一个不间断的更改,比如bug修复或者不可见类中的调整,会生成一个新的文件,它在其他方面与使用它的任何项目都完全兼容。您应该更新[assemblyfileversion]号。在C++/CLI项目中,需要更新非托管版本资源。可以自动更改相应的.rc文件,也可以使用定义。

    请注意,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 Bug不是Bug。以前从来没用过,失败是无声的。它是C++构建系统中的一个缺陷,MT.EXE嵌入清单。 之后 程序集具有强名称。并中断进程中的强名称,因为这会更改文件哈希。VS2010实际上是一个进步,它警告它,而不是默默地让一个破碎的强名称通过。你不必延迟签名,只需在后期创建事件中与-ra一起辞职。