前面【Visual Studio 2017創(chuàng)建.net standard類庫(kù)編譯出錯(cuò)原因】已經(jīng)解決.net standard類庫(kù)的編譯問題,現(xiàn)在可以正式進(jìn)入主題了。作為.net 跨平臺(tái)開發(fā)者也得跟上時(shí)代,響應(yīng)微軟變化。微軟正在開發(fā).net standard 2.0的版本,聽說將是最全的API庫(kù),那時(shí)目前使用的pcl類庫(kù)將會(huì)被替代??紤]到未來的變化,所以打算從現(xiàn)在開始新建xamarin項(xiàng)目的時(shí)候就去PCL化,全部.net standard 化。
由于2.0還沒有正式發(fā)布,xamarin也還沒有更新它的模板庫(kù)來支持.net standard ,所以很多都得手動(dòng)設(shè)置。
第一步:創(chuàng)建普通的Prism.Xamarin項(xiàng)目
第二步:更改PCL類庫(kù)為標(biāo)準(zhǔn)類庫(kù)。
1,VS2015就有的老方法,通過項(xiàng)目屬性頁(yè)的鏈接按鈕更改。
會(huì)提示如下錯(cuò)誤:
這時(shí)候只能刪除全部Nuget包再進(jìn)行操作,操作結(jié)束后再添回Nuget包。
轉(zhuǎn)換成功后默認(rèn)會(huì)帶有Microsoft.NETCore.Portable.Compatibility包,應(yīng)該刪除。
編輯project.json文件,添加如下設(shè)置,否則無法添加Xamarin等Nuget包:
1 2 3 4 5 6 7 | { "supports" : {}, "dependencies" : { "NETStandard.Library" : "1.6.1" }, "frameworks" : { "netstandard1.4" : { |
"imports": "portable-net45+net45+wp8+win81+wpa8"
1 2 3 | } } } |
備注:
Xamarin.Forms使用正式版2.3.3.193可以編譯通過。
類庫(kù)屬性:
2,直接創(chuàng)建新的.net standard類庫(kù),移植PCL內(nèi)容。
備注:記得更改位置,不然文件夾不和ios.uwp,droid項(xiàng)目在同級(jí)目錄。
在.csproj文件中添加如下設(shè)置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard1.4</TargetFramework> <PackageTargetFallback>$(PackageTargetFallback);portable-win+net45+wp8+win81+wpa8</PackageTargetFallback> </PropertyGroup> <ItemGroup> <PackageReference Include="Prism.Unity.Forms" Version="6.3.0" /> <PackageReference Include="Xamarin.Forms" Version="2.3.4.221-pre6" /> </ItemGroup></Project>
重新加載項(xiàng)目,把PCL類庫(kù)的文件全部托過來,編譯項(xiàng)目。
類庫(kù)屬性:
備注1:
Xamarin.Forms如果使用正式版2.3.3.193,編譯會(huì)出XamlCTask錯(cuò)誤。
Google的結(jié)果,這是一個(gè)Xamarin的Bug,beta-2.3.4-pre4版本已經(jīng)修正了。
https://bugzilla.xamarin.com/show_bug.cgi?id=53060
升級(jí)到beta-2.3.4-pre6編譯成功。
追加:
2017/4/5 Xamarin.Forms 2.3.4 正式版Release,用最新版應(yīng)該不會(huì)有以上問題。
https://blog.xamarin.com/announcing-xamarin-forms-stable-release-2-3-4/
備注2:
UWP項(xiàng)目的Microsoft.NETCore.UniversalWindowsPlatform為5.1.0版本時(shí)將會(huì)出現(xiàn)如下錯(cuò)誤:
System.Reflection.Emit.ILGeneration 4.3.0 為 UAP,Version=v10.0 上的 System.Reflection.Emit.ILGeneration 提供了編譯時(shí)引用程序集,但沒有與 win10-arm-aot 兼容的運(yùn)行時(shí)程序集。
一個(gè)或多個(gè)包與 UAP,Version=v10.0 (win10-arm-aot) 不兼容。
System.Reflection.Emit.ILGeneration 4.3.0 為 UAP,Version=v10.0 上的 System.Reflection.Emit.ILGeneration 提供了編譯時(shí)引用程序集,但沒有與 win10-x64-aot 兼容的運(yùn)行時(shí)程序集。
一個(gè)或多個(gè)包與 UAP,Version=v10.0 (win10-x64-aot) 不兼容。
System.Reflection.Emit.ILGeneration 4.3.0 為 UAP,Version=v10.0 上的 System.Reflection.Emit.ILGeneration 提供了編譯時(shí)引用程序集,但沒有與 win10-x86-aot 兼容的運(yùn)行時(shí)程序集。
一個(gè)或多個(gè)包與 UAP,Version=v10.0 (win10-x86-aot) 不兼容。
升級(jí)到最新5.3.1編譯將沒問題。
兩者區(qū)別
方法一:
project.json進(jìn)行包管理
屬性頁(yè)無復(fù)雜設(shè)置。
方法二:
.csproj文件進(jìn)行包管理。
屬性頁(yè)可以進(jìn)行啟動(dòng)對(duì)象等很多設(shè)置。
介于有這些區(qū)別,更加應(yīng)該使用VS2017的.net standard模板創(chuàng)建類庫(kù),以應(yīng)對(duì)未來的變化。
每天成就一小步,積累下來就是一大步。 轉(zhuǎn)發(fā)本文請(qǐng)注明出處,謝謝您的閱讀與分享!