预构建的MSBuild任务更新AssemblyInfo与构建的exe不同步

22

我正在使用Visual Studio 2008中的预构建任务来调用msbuild:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe $(MSBuildProjectDirectory)\version.targets /p:Configuration=$(ConfigurationName)

在version.targets文件中,我正在更新AssemblyInfo.cs文件以替换版本信息:

   <FileUpdate
        Encoding="ASCII"
        Files="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"
        Regex="AssemblyInformationalVersion\(&quot;.*&quot;\)\]" 
        ReplacementText="AssemblyInformationalVersion(&quot;Product $(ConfigurationString) ($(buildDate))&quot;)]"
    />

我在Visual Studio 2008中构建项目时,没有任何问题。

但是,当我查看生成的exe文件的版本信息时,即使AssemblyInfo.cs已经更改为“正确”的版本,它仍包含先前的时间戳。

似乎预构建的更改对主编译任务不可见,总是落后一个步骤。

有什么想法我做错了什么吗?


我不是疯子:http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/fe1d0b81-61f0-4224-8e38-feca158c9dc9/ - Richard Morgan
4个回答

25

我认为你没有做错任何事情-这是一个bug。

我已在这里报告了它,请检查是否可以重现此问题并添加验证,也许我们可以通过 MS 的修复此问题。

编辑:我尝试了“Si”建议的在“BeforeBuild”事件中更新文件的方法-但我仍然在 Visual Studio 2008/SP1 中得到相同的错误结果。

更新/解决方法:MS 已经回应了这个bug报告。作为一种解决方法,您可以添加

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>
将此添加到您的 csproj 文件中。

+1 因为我们非常依赖自动生成的代码,而在从VS2005切换到VS2008(SP1)后,我们遭受了很多这种错误的困扰(实际上这似乎不是一个错误,而是设计上的问题...设计得很糟糕!)。所以您的回答非常有帮助。 - mmmmmmmm
+1解决了我的问题。别忘了把它放在顶部的<PropertyGroup>中。 - Iain M Norman

14

对于使用 <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable> 技巧,我给予 +1 推荐。尽管被接受的答案和相关文章都没有指出应该将该行代码添加到.csproj文件中的第一个<PropertyGroup>元素中。

此外,这个问题只存在于使用Visual Studio时,如果在命令行运行强制重新编译同一.csproj文件(不使用技巧),则会立即编译生成的代码文件(而不是之前的版本)。

此外,我建议将此主题打上以下标签,因为我必须深入挖掘才能找到它:

  1. VisualStudio
  2. 编译器
  3. BeforeBuild
  4. 生成的
  5. .NET
  6. c#

3
有趣的是,我编写了自己的自定义任务并将其连接到BeforeBuild中,这很好地工作着。从未遇到过来自VS或通过命令行的MSBuild的问题。因此,我会建议更多地探索BeforeBuild... 我知道这是因为我们使用构建服务器(CruiseControl.NET)的构建号作为版本的“Build”部分,该版本内置于所有程序集中(我们在解决方案中跨程序集共享相同的AssemblyInfo.cs用于AssemblyVersion和AssemblyFileVersion),然后将其推送到我们WiX项目中的变量(通过FileUpdate任务),也用于标记MSI文件名。
<Target Name="BeforeBuild">
  <CallTarget Targets="UpdateAssemblyInfo" />
</Target>

<Target Name="UpdateAssemblyInfo" Condition="'$(CIBuildNumber)' != ''">
  <UpdateVersion Attribute="AssemblyFileVersion"
    AssemblyInfo=".\Properties\AssemblyInfo.cs" 
    BuildNumber="$(CIBuildNumber)" />
</Target>

如果您进行一些谷歌搜索,应该会找到其他示例...很抱歉我不能给您UpdateVersion代码,我需要得到我的工作许可,但是如果您在网络上找不到合适的内容,编写自定义任务很容易,上面的内容应该有所帮助。

您正在使用哪个版本/SP的Visual Studio? - laktak
我们最初使用的是VS 2005和.NET 2.0,现在我们正在使用VS 2008和.NET 3.5(带有最新的热修复和SP)。 - si618

0
使用以下类似的代码可以更改任何文件的任何内容。这里我正在更改hallo.aspx中的Build日期值,每次创建构建时都会更改。

例如 Hallo.aspx 内容

<BuildDate> 12-23.2011 </BuildDate>


<!-- regular expression to get value between html node: "[^<>]+(?=[<])" --> 
  <FileUpdate Files="$(AboutDir)Hallo.aspx" 
    Regex="Builddate[^&lt;&gt;]+(?=[&lt;])" ignoreCase="true" 
    ReplacementText="BuildDate: $(Day)-$(Month)-$(Year)" /> 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接