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

从.NET 4.8升级到.NET 8.0后,如何调用csproj中的自定义Target?

.NET 8中调用自定义MSBuild Target的解决方案

.NET 8采用的SDK风格项目构建模型和传统.NET Framework项目存在差异,直接沿用BuildDependsOn的方式可能无法触发自定义Target,以下是可行的解决方法:

1. 用BeforeTargets/AfterTargets绑定Target

这是SDK风格项目中最直接的方式,无需修改BuildDependsOn,直接指定自定义Target在某个标准构建流程节点前后执行。比如要在Build完成后执行你的LangResources,修改Target定义:

<Target Name="LangResources" 
        Inputs="@(Resource)" 
        Outputs="@(Resource -> '$(OutDir)%(Filename).resources')"
        AfterTargets="Build">
    <Message Text="Running ResourceCompiler... @(Resource)" Importance="high" />
    <GenerateResource Sources="@(Resource)" OutputResources="@(Resource -> '$(OutDir)%(Filename).resources')">
      <Output TaskParameter="OutputResources" ItemName="Resources" />
    </GenerateResource>
    <Message Text="Generated Resources... @(Resources)" Importance="high" />
</Target>

你可以根据实际需求选择绑定的标准Target,比如CoreCompile(编译完成后)、BeforeBuild(构建开始前)等。

2. 正确使用BuildDependsOn(若需保留原有方式)

SDK项目中BuildDependsOn的默认值由SDK定义,必须确保你的配置放在SDK导入节点之后,否则会被默认值覆盖。调整项目文件顺序:

<!-- 确保这行导入在你的BuildDependsOn配置之前 -->
<Import Project="$(SdkTargetsPath)\Microsoft.NET.Sdk.targets" />

<PropertyGroup>
   <BuildDependsOn>
      $(BuildDependsOn);
      LangResources;
    </BuildDependsOn>
</PropertyGroup>

3. 验证Target执行状态

如果仍无日志输出,可通过命令行构建查看详细日志,确认Target是否被触发或跳过:

dotnet build -v detailed

MSBuild会根据Inputs和Outputs的文件时间戳判断是否跳过Target,如果输出文件已存在且比输入文件新,会自动跳过执行。

4. 确认Resource项被正确识别

SDK项目中@(Resource)的默认包含规则可能和传统项目不同,可显式声明资源文件:

<ItemGroup>
   <Resource Include="**\*.resx" />
</ItemGroup>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:12:39