You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6项目中CodeTaskFactory在MSBuild构建服务器无法运行的方案咨询

替代CodeTaskFactory实现带输出的MSBuild UsingTask方案(.NET 6构建服务器场景)

问题背景

.NET 6项目中使用UsingTask结合CodeTaskFactory编写内联脚本设置AssemblyVersion,但在构建服务器上用.NET Core版MSBuild执行时出现以下错误:

Error MSB4801: The task factory "CodeTaskFactory" is not supported on the .NET Core version of MSBuild
Error MSB4175: The task factory "CodeTaskFactory" could not be loaded from the assembly "C:\Program Files\dotnet\sdk\6.0.101\Microsoft.Build.Tasks.Core.dll". The task factory must return a value for the "TaskType" property

原任务代码如下:

<UsingTask TaskName="mytask"    
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <AssemblyVersion ParameterType="System.String" Output="true" />
  </ParameterGroup>
  <Task>
    <Code Type="Fragment" Language="cs">
      <![CDATA[
        Log.LogMessage(MessageImportance.High, "we are here");
        AssemblyVersion = "1.2.3.4";
      ]]>
    </Code>
  </Task>
</UsingTask>

可行解决方案

方案1:用Exec任务调用外部脚本生成版本号

通过Exec调用PowerShell或C#脚本生成版本号,将结果写入临时文件,再通过MSBuild属性读取该文件内容。

示例配置:

<!-- 调用PowerShell脚本生成版本号并写入文件 -->
<Exec Command="powershell -Command &quot;Write-Output '1.2.3.4' | Out-File -FilePath 'version.txt' -Encoding utf8&quot;" />

<!-- 读取文件内容到AssemblyVersion属性 -->
<ReadLinesFromFile File="version.txt">
  <Output TaskParameter="Lines" ItemName="VersionLines" />
</ReadLinesFromFile>
<PropertyGroup>
  <AssemblyVersion>@(VersionLines)</AssemblyVersion>
</PropertyGroup>

方案2:自定义.NET Core兼容的MSBuild任务

编写独立的.NET Standard类库,实现自定义MSBuild任务,编译后在项目中引用该程序集。

  1. 创建类库项目,安装NuGet包Microsoft.Build.Utilities.Core
  2. 编写任务代码:
using Microsoft.Build.Utilities;

public class MyTask : Task
{
    [Output]
    public string AssemblyVersion { get; set; }

    public override bool Execute()
    {
        Log.LogMessage(MessageImportance.High, "we are here");
        AssemblyVersion = "1.2.3.4";
        return true;
    }
}
  1. 编译后在项目中引用该任务:
<UsingTask TaskName="MyTask" AssemblyFile="path/to/YourTaskLibrary.dll" />

<Target Name="SetVersion">
  <MyTask>
    <Output TaskParameter="AssemblyVersion" PropertyName="AssemblyVersion" />
  </MyTask>
</Target>

方案3:使用社区工具自动生成版本(如GitVersion)

如果版本号与Git提交记录关联,可使用GitVersion工具自动生成符合语义化的版本号,无需自定义任务。

  1. 安装GitVersion工具(可通过NuGet包GitVersion.MsBuild)
  2. 在项目文件中配置:
<PropertyGroup>
  <GitVersionVersion>1.0.0</GitVersionVersion>
</PropertyGroup>
<Import Project="$(NuGetPackageRoot)\gitversion.msbuild\*\build\GitVersion.MsBuild.targets" />

<!-- 直接使用GitVersion生成的属性 -->
<PropertyGroup>
  <AssemblyVersion>$(GitVersion_MajorMinorPatch)</AssemblyVersion>
</PropertyGroup>

内容的提问来源于stack exchange,提问作者Sonnich Jensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:35:22