C# - 无法从 MSBuild 脚本更改 ApplicationVersion

C# - Unable to change ApplicationVersion from MSBuild script

我是一名新手,试图通过 MS Office 加载项上的 AssemblyVersion 修改发布的 ApplicationVersion 值。 这是我的 csproj :

<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
  <Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
  <In>@(AssemblyVersion)</In>
  <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
  <Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
  <ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />

当我从 Visual Studio 2015 年发布应用程序时,日志显示正确的版本:

app Version : 4.4.9.0

但实际上使用的是VS中定义的ApplicationVersion :

<ApplicationVersion>1.0.0.0</ApplicationVersion>

我已经试过了:

有人知道我为什么要进行此更改吗?


更新

经过一些测试,我发现 MSBUILD 使用不同的 VSTO 目标文件:MSBuild\Microsoft\VisualStudio\v14.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets。 它似乎使用 PublishVersion,它是 ApplicationVersion 的副本。我不知道为什么,但如果我在我的目标中设置 ApplicationVersion,它不会更新 PublishVersion...如果我设置 publishVersion,我会在我的 bin 文件夹中获得好的版本,但发布失败(不要复制发布文件夹,因为它仍然想获取 bin 中带有 1_0_0_0 的文件夹)。 启动我的目标可能是错误步骤的问题,但我不知道什么时候必须完成。

有什么帮助吗?


更新 2

这似乎是 VS2015 发布工具的一个错误。如果我尝试使用 msbuild.exe 命令行,它运行良好:

在 VS 上,我收到一个错误,要求提供以下文件夹:

而使用以下 msbuild 命令,它可以工作: MSBuild xxx\ExcelAddIn1\ExcelAddIn1\ExcelAddIn1.csproj /t:clean;publish

有谁知道解决方法是什么?

首先,我有一个问题,当我在winform项目中使用你的代码并执行发布时,我得到了这样的错误:

我测试后发现

你得到的

ApplicationVersion是非法的三位数,不是四位数,所以你获取AssemblyVersion.

的方法有问题

一般,发布版本在Project Properties下(right-click on your project)-->发布

你可以注意到它是四位数字。

这证明你错过了 Pattern 属性 上的一个节点。

建议

你应该使用

 <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>

全部代码为:

 <Target Name="AfterCompile">
    <ReadLinesFromFile File="Properties\AssemblyInfo.cs">
      <Output TaskParameter="Lines" ItemName="AssemblyVersion" />
    </ReadLinesFromFile>
    <PropertyGroup>
      <In>@(AssemblyVersion)</In>
      <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
      <Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
      <ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
    </PropertyGroup>
    <Message Text="app Version : $(ApplicationVersion)" Importance="High" />
  </Target>

它将从 AssemblyInfo.cs 文件中读取 AssemblyVersion

在我身边,是

实际上,您的方法已经有效,它会覆盖应用程序的发布版本。

我认为您已经阅读了构建输出日志的第一部分,如下所示:

只是build开始时默认的系统初始值,只是显示在那里而已。然后通过您的自定义 msbuild 脚本实际上已经覆盖了它的值。

执行publish之前,先删除publish文件夹,binobj文件夹,然后执行publish,可以进入文件夹查看:

更新 1

我认为您的 csproj 文件导入了一些目标或 props 文件,其中其他目标覆盖了 AfterCompile 目标。所以你的方法失败了。

也就是说,你的方法可能在其他地方被覆盖了。

所以我认为您不应该使用 AfterCompile 作为目标名称,而应该将其命名为另一个以区分它们。

使用这个:

<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
    <ReadLinesFromFile File="Properties\AssemblyInfo.cs">
      <Output TaskParameter="Lines" ItemName="AssemblyVersion" />
    </ReadLinesFromFile>
    <PropertyGroup>
      <In>@(AssemblyVersion)</In>
      <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
      <Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
      <ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
    </PropertyGroup>
    <Message Text="app Version : $(ApplicationVersion)" Importance="High" />
  </Target>

,您可以在项目文件夹中添加一个名为Directory.Build.targets的文件 然后在上面添加我的代码:

 <Project>
    <Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
        <ReadLinesFromFile File="Properties\AssemblyInfo.cs">
          <Output TaskParameter="Lines" ItemName="AssemblyVersion" />
        </ReadLinesFromFile>
        <PropertyGroup>
          <In>@(AssemblyVersion)</In>
          <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
          <Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
          <ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
        </PropertyGroup>
        <Message Text="app Version : $(ApplicationVersion)" Importance="High" />
      </Target>
  </Project>

然后,删除binobjpublish文件夹,然后重新发布检查一下。

如果问题仍然存在,您应该尝试以下建议来解决问题:

1) 尝试通过工具-->导入和导出设置[=154=重置vs设置]-->重置所有vs设置

2)工具-->扩展和更新[=154=下禁用任何与第三方扩展] -->已安装,安装完成后,关闭VS,重启工程。

3) 您可以尝试 devenv /safemode 在 VS2015 的开发人员命令提示符上启动一个纯粹的初始 vs 来测试您的解决方案。

============================================= ==

更新 2

MS Office Excel AddIn 项目与传统项目有很大不同。而且用这种方式是不可能的。

作为解决方法,我认为您应该使用 msbuild 脚本来发布项目。

1) 创建一个名为 PublishExcel.proj

的文件

2) 在该文件中添加这些内容:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="SetAssemblyVersionToPublish">
<!--you must specify the full path of the AssemblyInfo.cs from your project -->
<ReadLinesFromFile File="C:\Users\xxx\Documents\Visual Studio 2015\Projects\ExcelAddIn1\ExcelAddIn1\Properties\AssemblyInfo.cs"> 
  <Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
  <In>@(AssemblyVersion)</In>
  <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
  <Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
  <ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />

<MSBuild Projects="C:\Users\Administrator\Documents\Visual Studio 2015\Projects\ExcelAddIn1\ExcelAddIn1\ExcelAddIn1.csproj" Properties="ApplicationVersion=$(ApplicationVersion)" Targets="Publish">
   </MSBuild>
</Target>
</Project>

3) 然后打开 VS2015 的开发人员命令提示符,然后键入:

msbuild xxx\xxx\PublishExcel.proj -t:SetAssemblyVersionToPublish

发布文件夹将在bin\Debug或Release\app.publish文件夹下。

此功能适用于 MS Office Excel AddIn 项目。