《2019年當我們在談.NET Core跨平臺時我們在談什么.pdf》由會員分享,可在線閱讀,更多相關《2019年當我們在談.NET Core跨平臺時我們在談什么.pdf(41頁珍藏版)》請在三個皮匠報告上搜索。
1、.NET Core 2019China.NET Conf 2019當我們在談.NET Core跨平臺時我們在談些什么?一個問題針對.NET Standard生成的程序集為什么能夠跨平臺執行?三篇文章歷史、現狀與未來歷史枷鎖復用之殤全新布局歷史、現狀與未來歷史枷鎖復用之殤全新布局.NET Framework=FCL+CLRFramework LibraryWindows FormsASP.NETWPFWCFWFData ServicesADO.NETEntity FrameworkLINQBasic Class Library(BCL)Common Language Runtime(CLR)Ap
2、plication Model(AppModel)Basic Class Library(BCL)Common Language Runtime(CLR)發展的歷程不斷膨脹的BCL1.01.12.03.03.54.04.54.5.14.5.24.64.7Application Model(AppModel)Basic Class Library(BCL)Common Language Runtime(CLR)“裁剪”的必要性Application Model(AppModel)Basic Class Library(BCL)Common Language Runtime(CLR)Applica
3、tion Model(AppModel)Common Language Runtime(CLR)BCL“跨平臺”的.NET Framework.NET FrameworkWindows PhoneSilverlightWindows Store.NET Micro FrameworkMono完全獨立,各自為政Application Model(AppModel)Basic Class Library(BCL)Common Language Runtime(CLR)歷史、現狀與未來歷史枷鎖復用之殤全新布局復用的難題Shared CodeShared Project 源代碼復用Shared.shp
4、rojFoo.csBar.csApp1.csprojApp2.csprojBCL(Windows Phone)BCL(Silverlight)C#C#C#Baz.csC#Foo.csC#Bar.csC#Baz.csC#Foo.csC#Bar.csC#Baz.cs更加理想的復用方式 程序集復用Shared.dllPCL(Portable Class Library)PCL ProfilesACBDProfile 4(A+D)Profile 2(A+B)Profile 3(A+C)Profile 1(A)問題1:程序集不一致Foundation,Version=1.0.0.0,Culture=ne
5、utral,PublicKeyToken=b03f5f7f11d50a3aShared.dllApp1App2Foundation,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3aFoundation,Version=1.0.0.0,Culture=neutral,PublicKeyToken=c05f5f6f71d50t3tRetargetable AssemblyShared.dllFoundation.dll(Retargetable)AssemblyFlagsAttributeAttributeUsage(A
6、ttributeTargets.Assembly,Inherited=false)public sealed class AssemblyFlagsAttribute:Attributepublic int AssemblyFlags get;public AssemblyFlagsAttribute(AssemblyNameFlags assemblyFlags);Flagspublic enum AssemblyNameFlagsNone=0,PublicKey=1,EnableJITcompileOptimizer=0 x4000,EnableJITcompileTracking=0 x
7、8000,Retargetable=0 x100問題2:跨程序集類型轉移Foo,Version=1.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3aShared.dllApp1App2Bar,Version=1.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3aBaz,Version=1.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3aclass FoobarbazDemoclass Programstatic void M
8、ain()Console.WriteLine(typeof(string).Assembly.FullName);Console.WriteLine(typeof(Func).Assembly.FullName);Runtime=v2.0.50727(.NET 3.5)mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089System.Core,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089Runtime=v4.0(.NET
9、4)mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089跨程序集類型的轉移mscorlib,Version=2.0.0.02.03.5Funcmscorlib,Version=2.0.0.0System.Core,Version=3.5.0.04.0mscorlib,Version=4.0.0.0如何定位轉移的類型?App.exeSystem.Core,Vers
10、ion=3.5.0.0System.Core,Version=3.5.0.0mscore,Version=4.0.0.0FuncRuntime=v4.0FuncSystem.Core.dllTypeForwardedToAttributeAttributeUsage(AttributeTargets.Assembly,AllowMultiple=true,Inherited=false)public sealed class TypeForwardedToAttribute:Attributepublic Type Destination get;public TypeForwardedToA
11、ttribute(Type destination);歷史、現狀與未來歷史枷鎖復用之殤全新布局.NET Core層次結構RuntimeCoreFXAppModelASP.NET CoreWindows FormsWPFUWPCoreCLRCoreCLRCoreCLRSystem.CollectionsSystem.ConsoleSystem.DataSystem.DiagnosticsSystem.DirectoryServicesSystem.DrawingSystem.GlobalizationSystem.IOSystem.NetSystem.NumericsSystem.Reflect
12、ionSystem.RuntimeSystem.SecuritySystem.TextSystem.ThreadingSystem.XmlSystem.Private.CoreLib.dllCoreFXAppModelASP.NET CoreWindows FormsWPFUWPRuntimeCoreCLRCoreCLRCoreCLRSystem.Private.CoreLib.dll大一統的.NETASP.NETWPFWindows FormsASP.NET CoreWPFWindows FormsUWPiOSOS XAndriod.NET Framework.NET CoreXamarin
13、.NET Standard.NET StandardShared.dllnetstandard.dllnetstandard.dllnetstandard.dllnetstandard.dll.NET Framework.NET Core.NET CoreDemopublic class Utilspublic static void PrintAssemblyNames()Console.WriteLine(typeof(Dictionary).Assembly.FullName);Console.WriteLine(typeof(SortedDictionary).Assembly.Ful
14、lName);class Programstatic void Main()Console.WriteLine(.NET Framework 4.7.2);Utils.PrintAssemblyNames();class Programstatic void Main()Console.WriteLine(.NET Core 3.0);Utils.PrintAssemblyNames();輸出結果.NET Framework 4.7.2mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089System,V
15、ersion=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089.NET Core 3.0System.Private.CoreLib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798eSystem.Collections,Version=4.1.1.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a類型轉移-.NET FrameworkShared.dll.assembly extern netstandard
16、.publickeytoken=(CC 7B 13 FF CD 2D DD 51).ver 2:1:0:0.assembly Sstandard.dll.assembly extern mscorlib.publickeytoken=(B7 7A 5C 56 19 34 E0 89).ver 0:0:0:0.assembly extern System.publickeytoken=(B7 7A 5C 56 19 34 E0 89).ver 0:0:0:0.class extern forwarder System.Collections.Dictionary2.assembly extern
17、 mscorlib.class extern forwarder System.Collections.Generic.SortedDictionary2.assembly extern System類型轉移-.NET Corenetstandard.dll.assembly extern System.Collections.publickeytoken=(B0 3F 5F 7F 11 D5 0A 3A).ver 0:0:0:0.class extern forwarder System.Collections.Generic.Dictionary2.assembly extern Syst
18、em.Collections.class extern forwarder System.Collections.Generic.SortedDictionary2.assembly extern System.Collections.assembly extern System.Private.CoreLib.publickeytoken=(7C EC 85 D7 BE A7 79 8E).ver 4:0:0:0.class extern forwarder System.Collections.Generic.Dictionary2.assembly extern System.Private.CoreLibSystem.Collection.dll類型轉移Shared.dllSystem.Collection.dllnetstandard.dllnetstandard.dllmscorlib.dllSystem.dllSystem.Private.CoreLib.dllDictionaryDictionarySortedDictionary.NET Framework.NET Corenetstandard.dll展望未來謝謝觀賞