首先,我有一个问题,当我在一个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文件夹,bin和obj文件夹,然后执行发布,你可以进入文件夹检查:
更新 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>
那么,删除bin、obj、publish文件夹,然后重新发布查看。
如果问题仍然存在,您应该尝试以下建议来解决问题:
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 项目。