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展望未来谢谢观赏