【问题标题】:C# - Unable to change ApplicationVersion from MSBuild scriptC# - 无法从 MSBuild 脚本更改 ApplicationVersion
【发布时间】:2021-03-08 13:35:32
【问题描述】:

我是一个新手,试图在 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>

我已经试过了:

  • 重置所有 VS 设置
  • 禁用任何与第三方的扩展程序
  • 使用安全模式
  • 如果我发布 WPF 应用程序,它运行良好

任何人都会知道我为什么会得到这个改变?


更新

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

有什么帮助吗?


更新 2

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

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

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

任何人都知道可以做些什么来解决?

【问题讨论】:

标签: c# visual-studio-2015 msbuild office-addins msbuild-task


【解决方案1】:

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

经过测试,我发现

你得到的ApplicationVersion是非法的三位数而不是四位数,所以你获取AssemblyVersion的方法有问题。

一般,发布版本在Project Properties下(右键你的项目)-->Publish

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

这证明你错过了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

在我身边,是

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

我想你已经像这样阅读了构建输出日志的第一部分:

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

执行发布之前,你应该删除publish文件夹,binobj文件夹,然后执行发布,你可以进入文件夹检查:

更新 1

我认为您的 csproj 文件已导入一些目标或道具文件,这些目标或道具文件有其他目标覆盖 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)尝试通过工具重置vs设置-->导入和导出设置-->重置所有vs设置

2)工具-->扩展和更新-->已安装下禁用任何与第三方的扩展> 之后,关闭 VS ,重新启动你的项目。

3)您可以在 VS2015 的开发人员命令提示符上尝试 devenv /safemode 来启动一个纯粹的初始 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 项目。

【讨论】:

  • 它不应该是你展示的。也许有什么问题。请检查我的答案,我已经更新了它。请检查一下。
  • 我按照你的建议做了,我仍然有同样的行为(即使在安全模式下)。有没有办法一步步调试发布过程?
  • 你只需要检查详细的构建,通过Tools发布日志-->Projects and Solutions-->Build and Run-->将MSBuild project build output verbosity设置为detailed以获取详细信息日志。您的 vs 环境或项目可能有问题。请尝试创建一个新项目,然后再次测试代码,以检查新项目是否仍然存在问题。如果还是不行,请修复vs2015在控制面板-->程序-->右键vs2015选择Change然后点击修复。
  • 或者您可以与我们分享您的项目示例,以帮助我们解决问题。
  • 我只是从头开始逐步创建应用程序。我忘记的一件事是发布的项目不是 WPF,而是 MS Office Excel 插件...如果我发布 WPF,它运行良好,但不适用于插件。我会看看这两个应用程序之间的区别。
猜你喜欢
  • 2019-11-18
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多