21

我在 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

4 回答 4

25

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

我已经在这里报告了- 检查您是否可以复制它并添加验证,也许我们可以通过 MS 修复它。

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

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

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

到您的 csproj 文件。

于 2009-03-14T16:11:01.597 回答
14

技巧+1 <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>,尽管接受的解决方案和链接的文章都没有指定该行应该添加到文件中的第一个 <PropertyGroup>元素.csproj

这也是仅 Visual Studio 的问题,因为从命令行对同一文件调用msbuild.csproj(没有技巧)将看到立即编译生成的代码文件(而不是以前的版本)。

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

  1. 视觉工作室
  2. 编译器
  3. 构建之前
  4. 生成
  5. 。网
  6. C#
于 2009-09-28T01:47:11.950 回答
3

有趣的是,我编写了自己的自定义任务,该任务与 BeforeBuild 挂钩,并且运行良好。通过命令行从未遇到过来自 VS 或 MSBuild 的问题。所以我会说探索BeforeBuild更多......

我知道是因为我们使用我们的构建服务器 (CruiseControl.NET) 构建号作为版本的“构建”部分,它内置于所有程序集中(我们在解决方案中的程序集之间共享相同的 AssemblyInfo.cs 和 AssemblyFileVersion)和然后将其推送(通过 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 代码,我需要我的工作许可,但如果您在网上找不到任何合适的东西,自定义任务很容易写,上面应该有帮助。

于 2009-03-14T16:41:01.867 回答
0

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


例如 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)" /> 

于 2011-09-06T08:47:47.733 回答