.Net Core迁移到MSBuild的多平台编译问题

一、前言

  本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework、.NET Core App、.NET Standard、Mono、UWP等多平台的条件编译、项目(包)引用、编译符号等问题。

  .NET Core已经将新的项目管理配置过渡回MSBuild编译系统中。虽然现在可以从无到有的使用VS2017来创建一个新的MSBuild项目,但是还是有好多遗留程序使用着以JSON格式存储的项目配置文件为基础的项目。Scott Hanselman也在博客中发文教大家怎么使用新的.NET SDK RC4工具将project.json转换到MSBuild的.csproj项目系统。当然这篇文章也解释了MS为什么要这么做。

  MSBuild 是一种基于 XML 的项目文件格式的项目配置文件。这种格式容易理解、易于扩展并且完全受 Microsoft 支持。MSBuild 项目文件的格式使开发人员能够充分描述哪些项需要生成,以及如何利用不同的平台和配置生成这些项。另外,项目文件的格式还使开发人员能够创作可重用的生成规则,这些规则可以分解到不同的文件中,以便可以在产品内的不同项目之间一致地执行生成。

  当时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

在project.json项目配置中定义多平台,使用的是”frameworks”节点来配置的,并且在每个平台节点下也配置了对应的项目引用或依赖。
下面的实例使用project.json定义的多平台和依赖如下:

"frameworks": {

    "net451": {

      "frameworkAssemblies": {

        "System.Xml": "4.0.0.0",

      }

    },

    "netstandard1.6": {

      "dependencies": {

        "System.Runtime":"4.1.0",

        "System.Xml.XmlSerializer": "4.0.11"

      },

    }

}

MSBuild

在.csproj项目配置中定义多平台,要使用”TargetFrameworks”的XML节点来配置:

<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>

当然有时候我们还需要对某个平台定义,定义编译符号常量:

<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.6'"><DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
</PropertyGroup>

这些代码中就可以针对平台特性来编写代码了:

#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。

原文地址:http://www.cnblogs.com/maxzhang1985/p/6481549.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

strcompare php,PHP中的startswith()和endsWith()函数

泛舟湖上清波郎朗功能function substr_startswith($haystack, $needle) {return substr($haystack, 0, strlen($needle)) $needle;}function preg_match_startswith($haystack, $needle) {return preg_match(~ . preg_quote($needle, ~) . ~A, $haystack) > 0;}function su…

2020蓝桥杯省赛---java---B---8(走方格)

题目描述 【问题描述】在平面上有一些二维的点阵。 这些点的编号就像二维数组的编号一样&#xff0c;从上到下依次为第 1 至第 n 行&#xff0c;从左到右依次为第 1 至第 m 列&#xff0c;每一个点可以用行号和列号来表示。现在有个人站在第 1 行第 1 列&#xff0c;要走到第 …

我是一位老师,讲课是我的乐趣,可是……

我是一位老师&#xff0c;讲课是我的乐趣&#xff0c;但是作为一个班的老师除了给学生讲课之外&#xff0c;我们还需要其他的管理&#xff0c;比如控班&#xff0c;比如管理学生、指导学生&#xff0c;学生不做作业怎么办&#xff0c;学生不听课怎么办&#xff1f;或者学生上课…

当我们在谈大前端的时候,我们谈的是什么

在今天&#xff0c;大前端并不是一个陌生的词汇&#xff0c;我们偶尔会听人谈起它&#xff0c;前些天还看到卓同学写了一篇《大前端时代下App开发者的生存之道》&#xff0c;说明这个词开始成为某种共识了。 但是大前端到底指的是什么&#xff1f;事实上大前端并没有明确的定义…

153. 寻找旋转排序数组中的最小值---LeetCode---JAVA

class Solution {public int findMin(int[] nums) {int minnums[0];for(int i1;i<nums.length;i){if(nums[i]<min){return nums[i];} }return nums[0];} }

hibernate中报错could not initialize proxy - no Session的解决方法

hibernate中报错&#xff1a;could not initialize proxy - no Session&#xff0c;怎么解决&#xff1f; 解决方法&#xff1a; 在该hbm文件中的 many-to-one 的最后加上&#xff1a;lazy”false”&#xff0c;请看&#xff1a; <many-to-one name"kecheng" cl…

MySQL group_concat()函数

转载自 MySQL group_concat()函数 MySQL GROUP_CONCAT函数介绍 MySQL GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串。 下面说明了GROUP_CONCAT()函数的语法&#xff1a; GROUP_CONCAT(DISTINCT expressionORDER BY expressionSEPARATOR sep);以下是…

MySQL标准偏差

转载自 MySQL标准偏差 标准差介绍 标准差是衡量数据集中值的分布情况&#xff0c;标准偏差显示平均值(平均值)存在多少变化。 低标准偏差表明数据集中的值接近于平均值。 而高标准偏差表示数据集的值在大范围的值上分散。 标准偏差是方差的平方根&#xff0c;可以通过以下…

从Visual Studio看微软20年技术变迁

前言 这个世界从来都不缺变革&#xff0c;从工业革命到晶体管和集成电路&#xff0c;从生活电器到物联网&#xff0c;从简陋人机到精致体验&#xff0c;我们在享受技术带来的便捷的同时&#xff0c;也在为复杂设计而带来的挑战和生产力下降而痛并快乐着。而迫切期盼的&#xff…

c传给php数据解包,小程序源码提取工具,完美解包,一键提取小程序源代码工具_PHP源码...

请注意&#xff1a;该源码来源网友分享&#xff0c;搜库资源网不提供技术支持&#xff0c;没有技术能力的小白勿拍。(如需安装服务费用另算)直接解压后就可以使用将小程序文件放到 wxapkg目录下然后打开 CrackMinApp.exe 按说明即可使用那么如何才能在手机里找到小程序的源文件…

2015蓝桥杯省赛---java---C---3(无穷分数)

题目描述 思路分析 它的结果会随着运算的次数越多,会越来越精确一个值,我们只需要把那个大约值求出来即可. 代码实现 package com.atguigu.lanqiao;public class Main {public static void main(String[] args) {System.out.printf("%.5f",f(1));}public static d…

致给博客粉丝

最近一段时间是我最忙的一段时间&#xff0c;也是博客粉丝找我最多的一段时间&#xff0c;好多粉丝找我要人脸识别的jar包和js文件&#xff0c;在这里我给大家统一说一下&#xff0c;粉丝们可以直接关注微信公众号&#xff1a;青鸟IT汇&#xff0c;回复&#xff1a;java人脸识别…

.Net Core迁移到MSBuild平台

一、前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中&#xff0c;简单的讲了下新的项目配置文件中的节点配置&#xff0c;这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程的节点配置。做过完整迁移新项目配置文件的朋友&#xff0c;肯定会觉得新的项…

青鸟IT汇微信公众号新增智能机器人

这么神奇的吗&#xff1f;居然可以智能小机器人无休止的聊天&#xff1f; 各位粉丝大家好&#xff0c;青鸟IT汇于2018年5月7日新加智能小机器人&#xff0c;粉丝们可以进行互动啦~~ 比如说&#xff1a; 或者这个样子的&#xff1a; 还有这个样子的&#xff1a; 偶尔的调戏…

2015蓝桥杯省赛---java---C---2(立方尾不变)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int sum0;for (int i 1; i < 10000; i) {String ai"";String b(long)(Math.pow(i,3))"";String cb.substring…

java人脸识别更新:摄像头支持360、火狐和谷歌浏览器

本次更新内容&#xff1a;打开摄像头在原有的火狐基础上新加360浏览器个谷歌浏览器&#xff0c;IE暂且不支持在index.js中&#xff0c;将这段代码&#xff1a;// 支持浏览器 谷歌,火狐,360,欧朋//navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianowif …

使用 Angular

N。正如上个月提到的&#xff0c;现在可以开始处理 MEAN 堆栈的前端。也就是说&#xff0c;我们将深入探究 Angular。自本文撰写之时起&#xff08;可能在今后的几年间&#xff09;&#xff0c;我们都会面临一个问题&#xff0c;即 Angular 存在某种版本问题。 Angular 多年来一…

php公告滚动源码,10行js代码实现上下滚动公告效果方法

本文主要给大家介绍了关于利用10行js代码实现滚动公告效果的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起看看吧。希望能帮助到大家。需求在最近的项目中需要实现公…

MySQL left()函数

转载自 MySQL left()函数 MySQL LEFT函数介绍 LEFT()函数是一个字符串函数&#xff0c;它返回具有指定长度的字符串的左边部分。 下面是LEFT()函数的语法 - LEFT(str,length);LEFT()函数接受两个参数&#xff1a; str是要提取子字符串的字符串。length是一个正整数&…

2020蓝桥杯省赛---java---B---10(整数小拼接)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int k sc.nextInt();int[] array new int[n];for (int i 0; i < n; i…