本篇主要討論.NET Core應用程序項目結構的主題,重點探索.NET Core應用程序的多平臺編譯問題,這裏指的多平臺是指.NET Framework、.NET Core App、.NET Standard、Mono、UWP等多平臺的條件編譯、項目(包)引用、編譯符號等問題。git
.NET Core已經將新的項目管理配置過渡回MSBuild編譯系統中。雖然如今能夠從無到有的使用VS2017來建立一個新的MSBuild項目,可是仍是有好多遺留程序使用着以JSON格式存儲的項目配置文件爲基礎的項目。Scott Hanselman也在博客中發文教你們怎麼使用新的.NET SDK RC4工具將project.json轉換到MSBuild的.csproj項目系統。固然這篇文章也解釋了MS爲何要這麼作。github
MSBuild 是一種基於 XML 的項目文件格式的項目配置文件。這種格式容易理解、易於擴展而且徹底受 Microsoft 支持。MSBuild 項目文件的格式使開發人員可以充分描述哪些項須要生成,以及如何利用不一樣的平臺和配置生成這些項。另外,項目文件的格式還使開發人員可以創做可重用的生成規則,這些規則能夠分解到不一樣的文件中,以即可以在產品內的不一樣項目之間一致地執行生成。json
當時ASP.NET Core的第一個版本爲了使開源平臺對開發者更具吸引力,ASP.NET Core採用了一種基於JSON的項目系統project.json文件定義,這是一種與Node.js相似的定義,這對於吸引Web開發者來講是個明智的選擇。可是隨着.NET Core的總體開源,非Web開發者如UWP和Xamarin,對這種JSON項目結構並不熟悉。這些開發者和社區都但願繼續使用MSBuild的XML項目系統。因些微軟宣佈他們將爲.NET Core從新啓用和規範MSBuild構建系統。在最新的.NET Core SDK 1.0 RC4 版本中,dotnet cli(命令行接口,dotnet cli 1.0.0-preview3-004056及之後版本)已經包含了」dotnet migrate」命令,這個命令爲了將JSON爲基礎的配置項目轉換爲.csproj項目配置文件。工具
本文再也不談論如何使用新dotnet cli命令行,而卓重討論多平臺編譯問題。學習
在project.json項目配置中定義多平臺,使用的是」frameworks」節點來配置的,而且在每一個平臺節點下也配置了對應的項目引用或依賴。
下面的實例使用project.json定義的多平臺和依賴以下:ui
"frameworks": { "net451": { "frameworkAssemblies": { "System.Xml": "4.0.0.0", } }, "netstandard1.6": { "dependencies": { "System.Runtime":"4.1.0", "System.Xml.XmlSerializer": "4.0.11" }, } }
在.csproj項目配置中定義多平臺,要使用」TargetFrameworks」的XML節點來配置:spa
<TargetFrameworks>netstandard1.6;net45;</TargetFrameworks>
若是要定義某個平臺下的依賴引用的話須要以下定義:命令行
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' "> <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' "> <PackageReference Include="System.Xml.XmlSerializer" Version="4.0.11"/> </ItemGroup>
固然有時候咱們還須要對某個平臺定義,定義編譯符號常量:code
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.6'"> <DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants> </PropertyGroup>
這些代碼中就能夠針對平臺特性來編寫代碼了:orm
#if NETSTANDARD //netstandard1.*平臺代碼 #endif
若是咱們想在某個平臺下,只編譯某些文件,也是能夠實現的:
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
<Compile Include="Platforms\net45\*.cs" />
</ItemGroup>
說實話MSBuild的項目配置系統仍是比較靈活的,之後整個dotnet體系的構建過程也都獲得了統一。在dotnet cli中也集成了msbuild,即dotnet build。
GitHub:https://github.com/maxzhang1985/YOYOFx 若是覺還能夠請Star下, 歡迎一塊兒交流。
.NET Core 開源學習羣:214741894