C# 用于更新AssemblyInfo的预生成MSBuild任务与生成的exe不同步

C# 用于更新AssemblyInfo的预生成MSBuild任务与生成的exe不同步,c#,visual-studio,msbuild,prebuild,generated,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

我正在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;)]"
    />

当我通过VisualStudio2008构建项目时,它构建时没有任何问题

但是,当我查看结果exe的版本信息时,它包含以前的时间戳,即使AssemblyInfo.cs已更改为“正确”的时间戳

主编译任务似乎看不到预构建的更改,而且它总是落后于主编译任务


你知道我做错了什么吗?

我不认为你做错了什么——这是一个bug

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

编辑:我在“BeforeBuild”事件中尝试了“Si”的建议来更新文件,但是在VisualStudio2008/SP1中仍然得到了同样的错误结果

更新/解决方法:MS已响应错误报告。作为解决方法,您可以添加

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>
FALSE

到您的csproj文件。

有趣的是,我编写了自己的自定义任务,该任务连接到BeforeBuild中,运行良好。VS或MSBuild通过命令行从未出现问题。所以我想说在建造更多之前先探索一下

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

+1对于
FALSE
技巧,虽然接受的解决方案和链接的文章都没有指定该行应添加到
.csproj
文件中的第一个
元素中

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

此外,我想建议在这个主题上加上以下标签,因为我需要挖掘很多才能找到它:

  • VisualStudio
  • 编译程序
  • 建造前
  • 产生
  • .NET
  • c#

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


    e、 g.你好。aspx内容

    12-23.2011


    
    

    我没有发疯:您使用的Visual Studio的/SP版本是什么?我们从VS2005和.NET 2.0开始,现在使用VS2008和.NET 3.5(带有最新的修补程序和SP)+1,因为我们大量使用自动生成的代码,在从VS2005切换到VS2008(SP1)之后,我们深受此错误的困扰(实际上,这似乎不是一个bug,但设计……糟糕的设计!)所以你的答案很有帮助。+1解决了我的问题。别忘了把它放在顶部。
    <!-- 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)" />