预构建MSBuild任务以更新AssemblyInfo与内置exe不同步

时间:2009-02-12 14:40:22

标签: c# visual-studio msbuild prebuild generated

我在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已使用“正确”更改。

似乎主编译任务没有看到预编译的变化,它总是落后于其中。

我做错了什么想法?

4 个答案:

答案 0 :(得分:25)

我不认为你做错了什么 - 这是一个错误。

我已将其报告here - 检查您是否可以重现并添加验证,也许我们可以通过MS修复它。

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

更新/替代方法:MS已回复错误报告。作为解决方法,您可以添加

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

到你的csproj文件。

答案 1 :(得分:14)

虽然接受的解决方案和链接文章均未指明该行应添加到第一个 <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>元素中,但

+1代表<PropertyGroup>技巧.csproj文件

这也只是Visual Studio的一个问题,因为在同一个.csproj文件上从命令行调用 msbuild (没有技巧)会看到生成的代码文件编译正确离开(而不是以前的版本)。

另外,我想建议将此主题标记为以下内容,因为我必须挖掘很多内容才能找到它:

  1. 的VisualStudio
  2. 编译
  3. BeforeBuild
  4. 产生
  5. .NET
  6. C#

答案 2 :(得分:2)

有趣的是,我编写了自己的自定义任务,它挂在了BeforeBuild中,这很好用。从未通过命令行从VS或MSBuild出现问题。所以我会说更多探索BeforeBuild ......

我知道,因为我们使用构建服务器(CruiseControl.NET)构建号作为版本的“构建”部分,它构建在所有程序集中(我们在程序集中共享AssemblyVersion和AssemblyFileVersion的AssemblyInfo.cs然后将其(通过FileUpdate任务)推送到我们的WiX项目中的变量,并用于标记MSI文件名。

<Target Name="BeforeBuild">
  <CallTarget Targets="UpdateAssemblyInfo" />
</Target>

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

如果你进行谷歌搜索,你应该找到其他的例子......对不起,我不能给你UpdateVersion代码,我需要得到我工作的许可,但是如果你在网上找不到合适的东西,那就定制了任务很容易写,上面应该有所帮助。

答案 3 :(得分:0)

使用以下内容更改任何文件的内容。这里我每次创建构建时都会在hallo.aspx中更改构建日期值。


e.g。 Hallo.aspx内容

&LT;创建日期&GT; 12-23.2011&lt; / BuildDate&gt;


<!-- 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)" />