如何利用.NET Core搭建跨平台的控制台应用程序

尽管传统意义上来说,.NET是只面向Windows的、闭源的专有平台,然而,传统观念即将被颠覆。新的开源跨平台的.NET Core已经开启,意味着你可以在任意平台写C#或.NET,然后在Windows、Linus和macOS运行

这个新的.NET平台正在GitHub上尝试对外开放,主要用到MIT和Apache的许可证,甚至还接收社区贡献。新平台的设计理念源自以往的开源编译器Roslyn(.NET编译器平台),目的在于不局限于Windows或Visual Studio,而是允许开发者在任意集成开发环境(IDE)中使用任意系统,然后在任意服务器或平台运行程序。

为了演示这个新平台,我们搭建一个超级简单的控制台应用程序,然后使用新的dotnet命令行接口(CLI)在Windows和Linux上运行。开始之前,需要先安装.NET Core(包含dotnet CLI工具)。微软的在线文档中为大多数平台(包括各种各样的发行版)提供完整的软件文档。

如果你不想在本地安装.NET Core,微软/dotnet:最新Docker图片预置了所有最新的工具和SDK。

搭建新程序

.NET Core版本迭代很快,我写的这些主要适用于当时的最新版本。

首先,我们用dotnet的新控制台搭建一个新的控制台应用程序,然后自动生成一个Program.cs和 .csproj,这是以当前的目录命名的(我的名为app.csproj)。

为了验证可行性,尝试运行一下dotnet restore,这个可以恢复运行程序需要用到的所有包。这个步骤完成后,运行dotnet run,然后你就可以在控制台看到关键信息Hello,World!了。

添加逻辑功能

在你最喜欢的文本编辑器中打开Program.cs,然后用下面的内容替换Console.WriteLine(“Hello World!”);,因为.NET与Visual Studio之间没有耦合关系,所以你可以用任意你喜欢的IDE或文本编辑器,甚至可以用vi。

Console.WriteLine($"Hello
{System.Environment.GetEnvironmentVariable("USER")}! 
I'm {System.Environment.MachineName} and I'm talking 
to you from 
{System.IO.Directory.GetCurrentDirectory()}");

对于不熟悉C#和.NET的人来说,这段代码实际上是在用当前环境的信息打印一个更详细版的经典Hello, World。注意,这里的代码并不是针对某一个指定的平台。

运行新程序

如果你现在运行dotnet build,你会得到一个.dll文件,还会有其他文件添加到你的./bin/Debug文件夹。你已经写了一段跨平台的控制台程序,将那些文件复制到另一台运行.NET Core的机器——Linux或者OS X也可以,然后运行dotnet ./path/to/your/app.dll,你将看到和前面一样的输出,然而你用的仍然是本地运行环境。幸运的是,.NET Core可以在一个独立包中搭建和发布本地二进制文件,所以你的目标系统(或用户)不用安装.NET也可以运行程序。

尝试其他平台

要想尝试跨平台应用程序,我们必须先确定用于搭建平台的.NET Core SDK,由于这个过程涉及到本地库,除了指明需要用到的平台以外,还需要确定风格和版本。

在应用目录中打开.csproj文件,将下列XML标签添加到各标签中:

<propertygroup><runtimeidentifiers>win10-x64;osx.10.12-
x64;debian.8-x64</runtimeidentifiers></propertygroup>

这样,.NET就知道我们想要为Windows 10 64-bit、macOS Sierra和Debian 8搭建一个独立的应用程序,接下来要做的就是运行之前选择的环境下的dotnet publish,然后在每一个平台上编译本地二进制文件。

注意一下,在./app/bin/Debug/netcoreapp1.1/文件夹中每一个平台都有对应的目录,每一个目录都有对应的publish文件夹,这个文件夹里有你的本地应用程序的副本,还有所有需要运行的.NET库的副本,所有没必要在目标系统上安装.NET,只需要把这些文件复制到一个新的文件夹然后运行可执行文件就好了。

结语

使用C#和新的.NET Core平台,你可以在任意平台搭建应用程序,再将它发布到任意平台——100%代码复用、完全本地、无运行时、不用安装框架。来GitHub吧,你可以看到新的框架让这项技术更加强大!不管对于C#还是.NET,这都是非常激动人心的时刻!


原文地址:https://opensource.com/article/17/5/cross-platform-console-apps


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

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

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

相关文章

自然语言处理中CNN模型几种常见的Max Pooling操作

转载自 自然语言处理中CNN模型几种常见的Max Pooling操作 自然语言处理中CNN模型几种常见的Max Pooling操作 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型。 图1展示了在NLP任务中使用CNN模型的典型网络结构。 一般而言&#xff0c;输入的字或者词用…

SpringTX

文章目录SpringTX的介绍SpringTX的使用代码示例声明式事务中属性解释SpringBoot中AOP事务配置SpringTX的介绍 问题&#xff1a; 在学习了Spring整合mybatis后&#xff0c;我们可以直接从Spring容器中获取mapper层的实例化对象完成数据库操作。而在业务层方法中很多时候因为业务…

详细整理分层开发步骤!

不点蓝字&#xff0c;我们哪来故事&#xff1f;一、创建数据库&#xff0c;在数据库中创建表二、创建java项目&#xff08;起名要有意义&#xff0c;eg&#xff1a;petSys&#xff09;三、在项目中新建包&#xff0c;包名为&#xff1a;cn.bdqn.petSys.entity四、在cn.bdqn.pet…

ZOJ1101-赌徒【二分查找】

前言 这道题原本老师说是哈希的练习题&#xff0c;结果发现哈希的代码量忒大&#xff0c;然后就用二分了。 正题 有n个赌徒&#xff0c;如果一个赌徒的钱数是其中三个的和那么这个赌徒是赢家&#xff0c;输出最多钱的赢家。 输入输出&#xff08;建议无视&#xff09; Input…

.NET 跨平台界面框架和为什么你首先要考虑再三

现在用 C# 来开发跨平台应用已经有很成熟的方案&#xff0c;即共用非界面代码&#xff0c;而每个操作系统搭配特定的用户界面代码。这个方案的好处是可以直接使用操作系统原生的控件和第三方控件&#xff0c;还能够和操作系统深度集成。 这里的深度集成主要是指一些 Windows 专…

seq2seq中的beam search算法过程

转载自 seq2seq中的beam search算法过程 首先说明在sequence2sequence模型中&#xff0c;beam search的方法只用在测试的情况&#xff0c;因为在训练过程中&#xff0c;每一个decoder的输出是有正确答案的&#xff0c;也就不需要beam search去加大输出的准确率。 假设现在我…

Spring的properties属性配置文件和Spring常用注解

Spring的properties属性配置文件 问题: 在学习了Spring的知识后&#xff0c;需要被Spring管理的资源都是通过配置文件的形式来告诉Spring容器对象管理谁以及如何管理。但是随着使用次数的增多&#xff0c;我们发现配置文件中配置的标签越来越多&#xff0c;每次我们创建一个新…

即日起,正式进入编程世界!

点击上方蓝色关注我们&#xff01;从今天开始&#xff0c;正式进入编程世界。首先我们先从堪称“少儿编程”的Scratch开始&#xff0c;简洁的编辑窗口加上可读性较高的Chinese&#xff08;大部分的编程编辑器均为英文版&#xff09;&#xff0c;使得该软件特容易上手。班内总有…

使用领域事件

1.引言 最近刚学习了下DDD中领域事件的理论知识&#xff0c;总的来说领域事件主要有两个作用&#xff0c;一是解耦&#xff0c;二是使用领域事件进行事务的拆分&#xff0c;通过引入事件存储&#xff0c;来实现数据的最终一致性。若想了解DDD中领域事件的概念&#xff0c;可参…

ssl2331OJ1373-鱼塘钓鱼 之1【纯贪心】

前言 dp做法 堆优化贪心做法 题目&#xff1a;OJ1373 正题 有N个鱼塘&#xff0c;给出每分钟可以钓到的鱼数和每钓一次下一次钓减少的鱼数和到下一个鱼塘需要几分钟&#xff08;不能回头&#xff09;。求限定时间内最多能够钓到的鱼数 解题思路 由于数据较小&#xff0c;我…

手把手教会你(单/多)文件上传(并修改文件默认的最大最小值)

/*** MultipartFile 自动封装上传过来的文件* param email* param username* param headerImg* param photos* return*/PostMapping("/upload")public String upload(RequestParam("email") String email,RequestParam("username") String usern…

深入浅出讲解语言模型

转载自 深入浅出讲解语言模型 深入浅出讲解语言模型 1、什么是语言模型呢&#xff1f; 简单地说&#xff0c;语言模型就是用来计算一个句子的概率的模型&#xff0c;也就是判断一句话是否是人话的概率&#xff1f; 那么如何计算一个句子的概率呢&#xff1f;给定句子&…

set注意点map遍历

/** 使用各种set存储多个学生信息问题1&#xff1a;为什么课程名称&#xff08;String&#xff09;放入到HashSet、LinkedHashSet都可以保证唯一性&#xff0c;但是学生&#xff08;Student&#xff09;放入到HashSet、LinkedHashSet&#xff0c;却无法实现唯一性。问题2&…

《认知红利》读书笔记

认知红利 谢春霖 24个笔记 ◆ 上篇 概念重塑 所以&#xff0c;金钱并不是你的财富&#xff0c;而是你“已经交换出去的那部分财富”的数字存在形式而已。 总之&#xff0c;真不真不重要&#xff0c;对不对不重要&#xff0c;你看不看才重要&#xff01; 一片树叶从树上落下&am…

基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

一、前言 至今为止编程开发已经11个年头&#xff0c;从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展&#xff0c;从无畏无知的懵懂少年&#xff0c;到现在的中年大叔&#xff0c;从中的酸甜苦辣也只有本人自知。随着岁月的成长&#xff0c;技术也从原来的三层设计到…

ssl2331OJ1373-鱼塘钓鱼 之2【贪心堆优化】

前言 上篇&#xff1a;纯贪心做法 下篇&#xff1a;dp做法 题目&#xff1a;OJ1373 正题 有N个鱼塘&#xff0c;给出每分钟可以钓到的鱼数和每钓一次下一次钓减少的鱼数和到下一个鱼塘需要几分钟&#xff08;不能回头&#xff09;。求限定时间内最多能够钓到的鱼数 解题思路…

NLP Coursera By Michael Collins - Week1

转载自 NLP Coursera By Michael Collins - Week1 NLP Coursera By Michael Collins - Week1 构建模型框架 - Markov Process 毕竟是机器学习嘛&#xff0c;所以第一步&#xff0c;先要把实际问题转化成数学模型。 在NLP中&#xff0c;一般使用的都是概率模型&#xff0c;…

JDBC登录功能实现

模拟淘宝登录 package com.bjsxt.jdbc2;import com.bjsxt.entity.User; import entity.Emp;import java.nio.file.attribute.UserDefinedFileAttributeView; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Scanner;/*** 模拟淘宝登…

19级:班级日常分享,一天一瞬间

点击上方蓝色关注我们&#xff01;19级的同学们目前正在做KTV点歌系统项目&#xff0c;截止今日为止&#xff0c;项目已经进展了1天多了&#xff0c;进度还在可控范围内&#xff0c;大部分组的后台都已完成&#xff0c;刘娜小组稍微比较慢了点儿。李磊小组的进度最快&#xff0…