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

时间:2017-07-27 12:00:55

标签: android xamarin msbuild nuget

•我使用了命令

xamarin-component.exe package C:\cmp\AndroidComponent\component 

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

错误讯息:

  

C:\ Program Files   (86)\的MSBuild \ Xamarin \的Android \ Xamarin.Android.Bindings.targets(155,2):   错误MSB3644:框架的引用程序集   " MonoAndroid,版本= 1.0"没找到。要解决此问题,请安装   此框架版本的SDK或Targeting Pack或重新定位您的   应用程序到您拥有SDK的框架版本   或安装了Targeting Pack。请注意,程序集将被解析   来自全球大会缓存(GAC)并将用于代替   参考组件。因此您的装配可能不正确   针对您想要的框架。   [C:\ CMP \ AndroidComponent \部件\样品\ 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" ...)。 •在构建android项目时,从路径调用msbuild.exe时,构建成功:“C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ msbuild.exe”( 32位)明确地

1 个答案:

答案 0 :(得分:1)

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

首先让我们看一下错误的代码部分(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自动检测:使用msbuild版本&#39; 14.0&#39;来自&#39; C:\ Program Files(x86)\ MSBuild \ 14.0 \ bin \ amd64&#39;。

(你自己在上面正确地确定了这一点),但只是为了跟随之后的任何人都清楚。

当您使用64位版本的MSBuild时,$(TargetFrameworkRootPath)被定义为C:\Program Files\Reference Assemblies\Microsoft\Framework但是Xamarin没有将任何Framework Utilities安装到该目录;相反,一切都存在于x86版本C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework

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

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

  1. 使用可选的-MSBuildPath参数进行还原时,告诉NuGet使用x86 MSBuild,如此处所述How Can I Tell NuGet What MSBuild Executable to Use?
  2. 升级到Visual Studio 2017以获取MSBuild 15
  3. $(TargetFrameworkRootPath)定义为C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework;这可以随心所欲地完成,最重要的是在执行之前将其设置为环境中的环境变量。请注意,如果您不小心,这可能会导致一系列意外的副作用。&lt; - 不要这样做,即使表格中有建议。