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


  
    netstandard2.0;uap10.0
  

  
    false
    UAP,Version=v10.0
    UAP
    10.0.16299.0
    10.0.10240.0
    .NETCore
    v5.0
    $(DefineConstants);WINDOWS_UWP
    $(MSBuildExtensionsPath)MicrosoftWindowsXamlv$(VisualStudioVersion)Microsoft.Windows.UI.Xaml.CSharp.targets
    None
  

  
    
  


需要将TargetFrame修改成TargetFrameworks、加入识别 uap10.0 的Framework声明以及 .NetCore for UWP的Nuget package。

接下来直接来看C# code就可以使用 #if 的语法 来区分targetframework。

public Uri BuildRequestUriString(IDictionary 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 的新技术拉~