无法为 android 源代码创建 Xamarin 组件



• 我使用了命令

xamarin-component.exe package C:cmpAndroidComponentcomponent 

用于创建 Xamarin 组件。在构建示例 android 项目时,它显示以下错误。(我使用了命令 xamarin-component.exe package C:\cmp\AndroidComponent\component -verbose 来详细显示错误消息(。

错误信息:

C:\程序文件 (x86(\MSBuild\Xamarin\Android\Xamarin.Android.Bindings.targets(155,2(: 错误 MSB3644:框架的引用程序集 未找到"MonoAndroid,Version=v1.0"。要解决此问题,请安装 此框架版本的 SDK 或目标包,或重新定位您的 应用程序到您拥有 SDK 的框架版本 或已安装目标包。请注意,将解析程序集 来自全局程序集缓存 (GAC(,将用于代替 引用程序集。因此,您的程序集可能不正确 针对所需的框架。 [C:\cmp\AndroidComponent\component\samples\App17\VidyoClientAndroid\VidyoClientAndroid.csproj]

注意:

我能够成功为iOS源代码创建Xamarin组件。 • 在为 Android 源代码创建 Xamarin 组件时,内部 msbuild.exe 从64 位文件夹(C:\Program Files (x86(\MSBuild\14.0\bin**amd64**\msbuild.exe "/p:Configuration=Release" "C:\cmp\AndroidComponent\component\samples\App17\App17.sln"...(。 • 当从路径"C:\Program Files (x86(\MSBuild\14.0\Bin\msbuild.exe"(32 位(显式调用 msbuild.exe 时,构建成功。

我们遇到了同样的问题; 你接近正确的答案,论坛有正确的答案。

首先,让我们看一下出错的代码部分(Xamarin.Android.Common.targets;在较新版本的Xamarin中,此代码要靠后得多(:

<Target Name="_GetReferenceAssemblyPaths">
<GetReferenceAssemblyPaths
TargetFrameworkMoniker="$(TargetFrameworkIdentifier),Version=v1.0"
RootPath="$(TargetFrameworkRootPath)">
<Output TaskParameter="ReferenceAssemblyPaths" PropertyName="_XATargetFrameworkDirectories" />
</GetReferenceAssemblyPaths>

这里最重要的部分是

$(TargetFrameworkRootPath)

当NuGet通过命令行运行时,我们看到它使用的是64位MSBuild可执行文件:

MSBuild 自动检测:使用 'C:\Program Files (x86(\MSBuild\14.0\bin\amd64' 中的 msbuild 版本 '14.0'。

(您在上面自己正确识别了这一点(但只是为了让任何跟随的人都清楚。

当您使用 64 位版本的 MSBuild 时$(TargetFrameworkRootPath)被定义为C:Program FilesReference AssembliesMicrosoftFramework但是,Xamarin 不会将任何框架实用程序安装到该目录; 相反,所有内容都位于此处的x86版本中C:Program Files (x86)Reference AssembliesMicrosoftFramework

当你在网上阅读时,很多人通过安装Visual Studio 2017解决了这个问题;但这是一个红鲱鱼,它只起作用,因为它导致NuGet使用Visual Studio 2017附带的MSBuild 15,显然不受此错误的影响。

有几种方法可以解决此问题:

  1. 告诉 NuGet 在使用可选的 -MSBuildPath 参数还原时使用 x86 MSBuild,如此处所述 如何告诉 NuGet 要使用的 MSBuild 可执行文件?
  2. 升级到 Visual Studio 2017 以获取 MSBuild 15
  3. 定义要C:Program Files (x86)Reference AssembliesMicrosoftFramework$(TargetFrameworkRootPath);这可以随心所欲地完成,最大的锤子是在执行之前将其设置为环境中的环境变量。请注意,如果您不小心,这可能会导致一系列意想不到的副作用。<-不要这样做,即使按照表格中的建议。>

最新更新