通过查看 Xamarin 的 .targets 文件发现了这一点。
短版
您可以:
- 创建一个 Android C++ 库项目并从您的 Xamarin Android 项目中引用它
或
- 注释掉 %PROGRAMFILES(x86)%\MSBuild\Xamarin\Android\Xamarin.Android.Common.After.targets 中定义的
Import 元素。请注意,这可能会禁用对向 Xamarin Android 项目添加 C++ 项目引用的支持。
一旦您执行其中一项操作,您的 Xamarin Android 项目就应该构建并运行。
加长版
首先,注意VS输出窗口中的错误:
C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common\ImportAfter\Microsoft.Cpp.Android.targets(54,9): error MSB4044: The "MergeApkRecipelists" task was not given a value for the required parameter "RecipeFiles".
错误中提到的 Microsoft.Cpp.Android.targets 文件似乎都是关于支持对 C++ 项目的项目引用。其中,MergeApkRecipelists 任务的元素如下所示:
<!-- language: lang-xml -->
<MergeApkRecipelists RecipeFiles="@(_NativeAndroidRecipeFiles)">
...
</MergeApkRecipelists>
NativeAndroidRecipeFiles 变量似乎没有在 .targets 文件中定义,因此推测它正在由构建过程初始化。但由于 .targets 文件似乎旨在支持 C++ 项目引用,因此我尝试将 Android C++ 共享库项目添加到我的解决方案中:
然后我从我的 Xamarin Android 项目中引用了 C++ 项目,瞧!之后构建运行成功。
但由于必须引入一个虚拟库非常繁重,我还追踪了 Xamarin 的 Microsoft.Cpp.Android.targets 文件被拉入的位置。这发生在 C:\Program Files (x86)\MSBuild\ Xamarin\Android\Xamarin.Android.Common.After.targets 文件,其中有一个Import 元素:
<!-- language: lang-xml -->
<Import Project="$(MSBuildThisFileDirectory)\Xamarin.Android.Common\ImportAfter\*"
Condition="Exists('$(MSBuildThisFileDirectory)\Xamarin.Android.Common\ImportAfter')"/>
这会带来 %PROGRAMFILES(x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common\ImportAfter 下的所有内容。由于该目录中唯一的项目是我们要排除的 .targets 文件,因此可以将其注释掉而不会影响其他任何内容。但请注意,由于此 .targets 文件似乎是支持从 Xamarin Android 项目中引用 C++ 项目的一部分,因此将其注释掉可能意味着它将不再正常工作。
注释掉 Import 语句后,Xamarin Android 项目应该在没有任何 C++ 引用的情况下构建和运行。