为何Exec Command在.NET Standard 2.0的.csproj文件中无法生效?
我来帮你排查这个迁移时遇到的问题——从.NET Framework转到.NET Standard 2.0的SDK风格项目时,自定义Rebuild目标失效是个挺常见的坑,咱们一步步来拆解原因和解决办法:
1. SDK风格项目的MSBuild目标结构变化
.NET Framework的旧项目文件和.NET Standard的SDK风格项目,MSBuild的目标依赖链完全不同。你直接定义<Target Name="Rebuild">会覆盖默认的Rebuild目标,但SDK风格项目的Rebuild有更复杂的依赖(比如Clean+Build),直接覆盖会导致逻辑冲突,你的Exec命令可能根本没机会触发。
解决办法:不要直接覆盖Rebuild目标,改用BeforeTargets或AfterTargets来挂钩到Rebuild流程中:
<Target Name="GenerateXmlClassesFromXsd" BeforeTargets="Rebuild"> <!-- 替换成你的实际exe调用命令 --> <Exec Command="$(MSBuildProjectDirectory)\path\to\your-generator.exe $(MSBuildProjectDirectory)\schemas\your.xsd" /> </Target>
这样你的自定义任务会在Rebuild开始前自动执行,不会干扰默认的Rebuild逻辑。
2. 检查exe的路径是否正确
在旧的.NET Framework项目中,相对路径通常基于项目根目录,但SDK风格项目的默认工作目录可能是输出目录(比如bin\Debug\netstandard2.0),导致找不到你的exe或xsd文件。
解决办法:用MSBuild内置属性指定绝对路径,比如:
$(MSBuildProjectDirectory):项目文件所在的根目录$(SolutionDir):解决方案根目录(如果是多项目解决方案)
示例:
<Exec Command="$(MSBuildProjectDirectory)\tools\xsd-generator.exe $(MSBuildProjectDirectory)\schemas\data-model.xsd" />
3. 排查exe的运行环境问题
如果你的生成exe是32位程序,而当前运行的MSBuild是64位版本(Visual Studio默认是64位),可能会导致exe无法正常启动;或者exe依赖特定版本的.NET Framework,而迁移后的环境中没有安装。
解决办法:
- 强制用32位命令行调用exe:
<Exec Command="%WINDIR%\SysWOW64\cmd.exe /c "$(MSBuildProjectDirectory)\tools\32bit-generator.exe"" /> - 检查exe的依赖,确保目标环境中安装了所需的.NET Framework版本。
4. 查看MSBuild日志确认目标触发情况
如果以上方法都没解决,建议查看详细的MSBuild日志,确认你的自定义目标是否被触发,有没有错误信息。
操作步骤:
- 在Visual Studio中打开「视图」→「输出」窗口
- 从输出窗口的下拉菜单中选择「MSBuild」
- 执行Rebuild操作,查看日志中是否有你的自定义目标名称(比如
GenerateXmlClassesFromXsd),以及是否有命令执行的错误提示。
内容的提问来源于stack exchange,提问作者Andre Grobler

