Windows 10 UWP 33 of N: Dot Net standard 2.0 with UWP app ( .Net Standard 2.0)

如何在UWP app上使用.Net standard 2.0 的Library

前言

在.Net standard進入到2.0之後很多缺少的API直接加入到了這個強大的set中!基本上只要是.net的 application (包含web app, desktop app, uwp, xamarin)都可以享受到.net standard 2.0所帶來的優勢!

 


使用 .net standard 2.0在 UWP的專案上有一個必要的限制! 也就是需要調整最低的Api support到 Fall creator update( offical 16299 SDK) 目前這算是會比較麻煩的問題點所在,畢竟在企業內部很有可能還是在 creator update 或是 anniversary update的Windows 10。

Demo 環境
Windows 10 FCU
Visual studio 2017 15.4.4
UWP develop environment + Fall creator update SDK ( build-16299 )

在UWP專案直接調整最低支援版本為FCU就可以了(當然目前也只有到FCU為Offical的最新SDK)

如果有安裝過 .net standard 2.0的SDK 就可以在新增專案的選單中看到大致如下的畫面

會是在所選取之語言之下的獨立選單(.Net Standard) 建立起來的Libarary基本上會使直接使用2.0的版本。

而這邊有趣的是在使用.Net Standard 2.0專案的時候只會看到有相依性的參考目錄,展開後就可以看到.NetStandard.Library在SDK之下。

接著就可以直接在UWP的參考中加入新增之.Net standard 2.0的專案了!但是....這邊依然有些Code是沒辦法在UWP上面跑的。請參考以下Link

https://github.com/dotnet/corefx/wiki/UWP-Compat

這邊有說明到有些 .Net Core的API 再目前設計把 UWP的Compatible設定為false,說真的有些好用的API都只能看看是否有upload到nuget了...

這邊有個很好用的API在Reflection裡面~Assembly.GetExecutingAssembly 可以抓到現在正在執行的app domain的assembly!也是要到16299之後的UWP專案才Support。


接著來介紹一下如何在.Net Standard中使用UWP的API,在.Net standard中支援所謂的Multiframework build的功能!也就是可以將Code寫在同一個專案之中,並且可以提供不同平台之實作。以HttpClient為例,在UWP 配上C#的時候可以使用如下

  1. Windows.Web.Http.HttpClient
  2. System.Net.Http.HttpClient

這邊可以參考  https://blogs.windows.com/buildingapps/2015/11/23/demystifying-httpclient-apis-in-the-universal-windows-platform/ 來說明。

簡單來說System.Net.Http的是適用所有.Net framework的實作,而使用Windows.Web.Http的是使用UWP的Framework的實作!所以使用 System開頭的Namespace可以使用在C#、VB的專案;而Windows的namespace可以使用在C#、VB、C++/CX、Javascript上!

這邊直接說明如何實作在.net standard上使用UWP的API!

  1. 建立.net standard 2.0的專案
  2. 在專案右鍵選擇編輯csproj
  3. 加入以下Code
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;uap10.0</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)' == 'uap10.0'">
    <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
    <NugetTargetMoniker>UAP,Version=v10.0</NugetTargetMoniker>
    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
    <TargetPlatformVersion>10.0.16299.0</TargetPlatformVersion>
    <TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
    <TargetFrameworkIdentifier>.NETCore</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
    <DefineConstants>$(DefineConstants);WINDOWS_UWP</DefineConstants>
    <LanguageTargets>$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets</LanguageTargets>
    <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
  </PropertyGroup>

  <ItemGroup Condition=" '$(TargetFramework)' == 'uap10.0' ">
    <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform" Version="6.0.6" />
  </ItemGroup>

</Project>
需要將TargetFrame修改成TargetFrameworks、加入識別 uap10.0 的Framework宣告以及 .NetCore for UWP的Nuget package。

接下來直接來看C# code就可以使用 #if 的語法 來區分targetframework。

public Uri BuildRequestUriString(IDictionary<string, object> parameters = null)
        {
            var baseUriString = $"{BaseEndpointUriString}/{ApiVerb1}/{ApiVersion}/{ApiVerb2}";
            if (parameters == null)
            {
                System.Diagnostics.Debug.WriteLine(baseUriString);
                return new Uri(baseUriString);
            }
            else
            {
#if NETSTANDARD2_0
                var queryString = HttpUtility.ParseQueryString(string.Empty);
                foreach (var parameter in parameters)
                {
                    queryString[parameter.Key] = $"{parameter.Value}";
                }

                System.Diagnostics.Debug.WriteLine($"{baseUriString}?{queryString}");
                return new Uri($"{baseUriString}?{queryString}");
#elif WINDOWS_UWP
                foreach(var parameter in parameters)
                {
                    var index = parameters.ToList().IndexOf(parameter);
                    if (index == 0)
                    {
                        baseUriString+= $"?{parameter.Key}={parameter.Value}";
                    }
                    else
                    {
                        baseUriString+= $"&{parameter.Key}={parameter.Value}";
                    }
                }
                System.Diagnostics.Debug.WriteLine($"{baseUriString}");
                return new Uri($"{baseUriString}");
#endif
            }

.Net standard 2.0可以使用HttpUtility,但UWP並沒有提供該語法!

展開相依性之後可以看到如下圖片

總結

.Net standard 2.0 並不是Framework!所以基本上時做了.net 的大多的API,如果使用P/Invoke的部分沒有實作。因為.net  standard的用意是可以跨在各個.net standard所能支援的OS platform ( windows, xamarin ) 想對.net standard更多認識可以看以下兩個 channel 9 影片

https://channel9.msdn.com/Shows/XamarinShow/Episode-37-NET-Standard-Libraries-with-Immo-Landwerth

https://channel9.msdn.com/Shows/On-NET/NET-Standard-Deep-Dive?term=.net%20standard

 

***以上Code以及說明都有可能隨著Windows 10 的版本以及Visual Studio 版本有所調整!***

參考資料 Microsoft Docs, Github of dotnet standard ( https://github.com/dotnet/standard/issues/462 )

下次再分享Windows 10 的新技術拉~

  • 回首頁

4617作文网如何算是什么命周易算命婚配吴氏男孩起名三个字生辰八字起名女性不宜周公解梦梦见文字八字算命起名字免费蒋怎么起名字起名字大全男孩高姓4字梦见钓鱼 周公解梦带坤公司起名用字大全喜起名字八字算命准确度给猪宝宝起小人名大全2019年给男孩起名煜怎么起名字吗周易大师3在线阅读天天做梦周公解梦姓侯的女孩起名字13笔画的有什么字适合起名字期货 周末交易吗专业名字免费起名字苏州算命准的地方周公解梦大全查询梦到捡钱用天起名字给学校起个名字的济南算命准的人蓝字起名女孩杨周起名十三笔画的字的适合起名字原版周公解梦大全免费淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男子给前妻转账 现任妻子起诉要回网友建议重庆地铁不准乘客携带菜筐月嫂回应掌掴婴儿是在赶虫子重庆警方辟谣“男子杀人焚尸”国产伟哥去年销售近13亿新的一天从800个哈欠开始男孩疑遭霸凌 家长讨说法被踢出群高中生被打伤下体休学 邯郸通报男子持台球杆殴打2名女店员被抓19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警两大学生合买彩票中奖一人不认账德国打算提及普京时仅用姓名山西省委原副书记商黎光被逮捕武汉大学樱花即将进入盛花期今日春分张家界的山上“长”满了韩国人?特朗普谈“凯特王妃P图照”王树国3次鞠躬告别西交大师生白宫:哈马斯三号人物被杀代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了房客欠租失踪 房东直发愁倪萍分享减重40斤方法“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火手机成瘾是影响睡眠质量重要因素考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼网友洛杉矶偶遇贾玲呼北高速交通事故已致14人死亡西双版纳热带植物园回应蜉蝣大爆发男孩8年未见母亲被告知被遗忘张立群任西安交通大学校长恒大被罚41.75亿到底怎么缴沈阳一轿车冲入人行道致3死2伤奥运男篮美国塞尔维亚同组周杰伦一审败诉网易国标起草人:淀粉肠是低配版火腿肠外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万杨倩无缘巴黎奥运男子被猫抓伤后确诊“猫抓病”春分“立蛋”成功率更高?记者:伊万改变了国足氛围奥巴马现身唐宁街 黑色着装引猜测

4617作文网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化