根据您对原始问题的最后评论,我将采取另一种方法,并忘记您当前采用的方法。您应该知道您的版本信息不必位于 AssemblyInfo.cs 文件中。它可以位于任何代码文件中,只要您仅分别定义一次 AssemblyVersion 和 AssemblyFileVersion 属性即可。话虽这么说,我要做的是按照以下步骤操作:
- 从 AssemblyInfo.cs 中删除 AssemblyVersion 与 AssemblyFileVersion
- 创建一个新文件,将其命名为您想要的任何名称,在我的例子中,我将其放在 Properties\VersionInfo.cs 中。不要将此文件添加到项目中。
- 编辑项目文件以将该文件包含到仅在需要时才编译的文件列表中
让我们对#3 进行一些扩展。当您生成 .NET 项目时,该项目本身就是一个 MSBuild 文件。在该文件中,您将找到一个声明为 Compile 的项目。这是将发送到编译器进行编译的文件列表。您可以动态地包含/排除该列表中的文件。在您的情况下,仅当您在构建服务器上构建(或您定义的任何其他条件)时,您才需要包含 VersionInfo.cs 文件。对于此示例,我将该条件定义为项目是否在发布模式下构建。因此,对于发布模式,VersionInfo.cs 将被发送到编译器,而对于其他版本则不会。这是VersionInfo.cs的内容
版本信息.cs
[assembly: System.Reflection.AssemblyVersion("1.2.3.4")]
[assembly: System.Reflection.AssemblyFileVersion("1.2.3.4")]
为了将其挂接到构建过程中,您必须编辑项目文件。在该文件中,您将找到一个元素(可能超过 1 个,具体取决于项目类型)。您应该在那里添加类似于以下内容的目标。
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(Configuration)'=='Release' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
我在这里所做的就是定义一个目标 BeforeCompile,这是一个众所周知的目标,您可以覆盖它。看到这个MSDN 文章关于其他类似的目标。基本上,这是一个始终在调用编译器之前调用的目标。在此目标中,仅当 Configuration 属性设置为 release 时,我才将 VersionInfo.cs 添加到 Compile 项。您可以将该属性定义为您想要的任何内容。例如,如果您将 TFS 作为构建服务器,那么它可能是,
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(TeamFoundationServerUrl)'!='' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
因为我们知道TeamFoundationServerUrl只有在通过TFS构建时才被定义。
如果您正在从命令行构建,那么像这样
<Target Name="BeforeCompile">
<ItemGroup Condition=" '$(IncludeVersionInfo)'=='true' ">
<Compile Include="Properties\VersionInfo.cs" />
</ItemGroup>
</Target>
当您构建项目时,只需执行 msbuild.exe YourProject.proj /p:IncludeVersion=true 即可。注意:这在构建解决方案时不起作用。