为啥将 Xamarin Android .csproj 加载到 Microsoft.Build.Evaluation.Project 会由于缺少 .targets 文件而引发 InvalidPrope

Posted

技术标签:

【中文标题】为啥将 Xamarin Android .csproj 加载到 Microsoft.Build.Evaluation.Project 会由于缺少 .targets 文件而引发 InvalidPropectFileException?【英文标题】:Why does loading a Xamarin Android .csproj into a Microsoft.Build.Evaluation.Project throw InvalidPropectFileException due to missing .targets file?为什么将 Xamarin Android .csproj 加载到 Microsoft.Build.Evaluation.Project 会由于缺少 .targets 文件而引发 InvalidPropectFileException? 【发布时间】:2021-11-27 15:31:10 【问题描述】:

我正在尝试使用 Microsoft.Build.Evaluation.Project 的实例在 .NET 5.0 控制台应用程序中打开 Xamarin android .csproj 文件。此外,我还尝试对 .NET Framework 4.6.1 项目做同样的事情。

加载代码为:

var fileName = @"C:\Users\vchel\source\repos\BlankAndroid\BlankAndroid\BlankAndroid.csproj";
var project = new global::Microsoft.Build.Evaluation.Project(fileName, null, null, new ProjectCollection());

当我尝试实例化 Project 对象时,出现以下异常:

Microsoft.Build.Exceptions.InvalidProjectFileException: 
The imported project "C:\Users\vchel\source\repos\ProjectLoadTest\ProjectLoadTest\bin\Debug\net5.0\Xamarin\Android\Xamarin.Android.CSharp.targets" was not found.
Confirm that the expression in the Import declaration "C:\Users\vchel\source\repos\ProjectLoadTest\ProjectLoadTest\bin\Debug\net5.0\Xamarin\Android\Xamarin.Android.CSharp.targets" is correct, and that the file exists on disk.  C:\Users\vchel\source\repos\BlankAndroid\BlankAndroid\BlankAndroid.csproj

上述错误中引用的 Xamarin.Android.CSharp.targets 文件出现在我正在加载的 .csproj 中,如下面的 sn-p 所示:

  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />

请注意,.csproj 引用了带有 $(MSBuildExtensionPath) 前缀的 Xamarin.Android.CSharp.targtets 文件,但在运行时,它会与正在运行的控制台应用程序 .exe 的位置进行交换,而不是

我尝试加载的 Android 项目在 Visual Studio 中正确打开,并且编译/运行没有问题。

为什么这个 Android 项目在 Visual Studio 中打开时没有任何问题,但尝试在 Microsoft.Build.Evaluation.Project 对象中打开时却失败了?

【问题讨论】:

【参考方案1】:

似乎我之前确实遇到过同样的问题,但它不在 Android 项目中,所以我将把这个问题留在这里以解决 Android 特定的问题。

一般的问题在这里讨论:

How to Load .csproj file into .NET Core 3.0 using MSBuild NuGet

总结是 - .target 文件与正在安装的 nuget 包是分开的,似乎 Project 类无法解析 $(MSBuildExtensionsPath)。因此,要解决此问题,应将相关的 .targets 文件添加到项目中并复制到输出(bin)文件夹中。

在我的机器上,可以在以下位置找到原始文件:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Xamarin\Android

我必须将以下文件添加到我的应用程序中。请注意,它们已添加到 Xamarin/Android/ 文件夹中:

项目可以标记为如果较新则复制

【讨论】:

以上是关于为啥将 Xamarin Android .csproj 加载到 Microsoft.Build.Evaluation.Project 会由于缺少 .targets 文件而引发 InvalidPrope的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该在 Xamarin 中使用可移植类库?

为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1

为啥滚动这个 xamarin 页面这么慢?

为啥 Xamarin Forms 对所有页面使用一个 Activity

为啥 xamarin 表单列表视图中的组标题在发布模式下不可见?

将Xamarin.Android应用程序迁移到Xamarin.Forms应用程序