为何加载Xamarin Android .csproj到Microsoft.Build.Evaluation.Project时缺失.targets报错
问题原因
Visual Studio运行时会自动初始化完整的MSBuild运行上下文,内置变量$(MSBuildExtensionsPath)会被正确解析为VS安装目录下的MSBuild扩展存储路径,该路径下默认包含Xamarin相关的.targets文件,因此项目可以正常加载编译。
你直接通过Microsoft.Build.Evaluation.Project加载项目时,默认使用当前控制台应用的运行目录作为MSBuild根路径,内置变量$(MSBuildExtensionsPath)会被错误解析为你的程序输出目录,自然找不到对应的Xamarin .targets文件,因此抛出InvalidProjectFileException异常。
解决方案
你需要先手动初始化MSBuild的运行环境,再执行项目加载操作,步骤如下:
- 安装必要的NuGet包
- 若使用.NET 5+版本的控制台程序,安装
Microsoft.Build.Locator、Microsoft.Build、Microsoft.Build.Utilities.Core包 - 若使用.NET Framework 4.6.1版本的控制台程序,确保引用的Microsoft.Build相关程序集来自本地Visual Studio安装目录,而非NuGet源中的独立版本
- 若使用.NET 5+版本的控制台程序,安装
- 在程序入口最前端先注册本地有效的MSBuild实例,再执行项目加载逻辑,示例代码如下:
// 首先注册MSBuild环境,必须放在所有使用MSBuild API的代码之前 MSBuildLocator.RegisterDefaults(); var fileName = @"C:\Users\vchel\source\repos\BlankAndroid\BlankAndroid\BlankAndroid.csproj"; var project = new global::Microsoft.Build.Evaluation.Project(fileName, null, null, new ProjectCollection());
如果RegisterDefaults()识别不到本地的VS安装实例,也可以手动指定对应的VS实例路径:
var vsInstance = MSBuildLocator.QueryVisualStudioInstances().FirstOrDefault(x => x.Version.Major >= 19); // 对应VS2022,可根据实际版本调整 MSBuildLocator.RegisterInstance(vsInstance);
内容的提问来源于stack exchange,提问作者Victor Chelaru
相关产品推荐
相关产品推荐

