.NET Core:一次编译,到处运行





5.00/5 (7投票s)
PoC - 一次小小的旅程,看看 .NET Core 如何实现跨平台
引言
将 .NET Framework 引入除 Windows 之外的平台这个讨论从一开始就存在(毕竟最大的竞争对手无处不在)。大约两年前,讨论变成了行动,微软开始塑造我们今天所称的 .NET Core——一个“跨平台、开源、模块化的 .NET 平台,用于创建现代 Web 应用程序、微服务、库和控制台应用程序”(.NET 博客 - 2016 年 6 月 27 日)。
我是开源的忠实粉丝,也是 .NET 的忠实粉丝,所以我从一开始就玩 Mono,后来又玩 Xamarin,最终对 .NET Core 的新闻感到兴奋。
在这里,我想展示使用 .NET Core 迈入 .NET 跨平台世界的第一步。
背景
非常重要的一点是,要理解 .NET Core **不是** .NET Framework 的重制,而是一个新的——并行的——框架,按照与原始框架相同的指导方针实现。它重新实现了 .NET Framework 中所有可以跨平台完成的功能。这种重新实现遵循 .NET 标准库(ECMA-335 标准),因此 .NET Core 与 .NET Framework 兼容。
原始框架中未实现的是与 UI 相关的库(UI 高度依赖于平台/设备),因此 .NET Core 唯一存在的 UI 形式是控制台。然而,这恰好使其非常适合作为任何 UI(桌面或 Web)的骨干的库和服务,无论设备如何。
尽管对 .NET Core 赞不绝口,但重要的是要理解它是一个新的开始,而不是像更成熟的 .NET Framework 那样已经完美无瑕,但在我看来,对于那些希望为他们的 .NET 应用程序开辟新目标的人来说,它可能是一个巨大的机遇...
环境设置
为了看到奇迹发生,我创建了两台虚拟机——一台安装了 Windows 7,另一台安装了 Fedora 23。
要查看支持的 Linux 版本以及当前状态,您可以在此处查看“构建状态”表:.NET Core 运行时。
此时,不要试图耍小聪明使用更新的发行版——它可能无法工作(.NET Core 有严格的依赖关系,甚至拒绝使用某些库的更新版本)。
Windows
要安装 .NET Core,请遵循以下链接之一
这些是常用安装程序,它们会将 .NET Core 和支持 SDK 安装到您的机器上...
要检查安装,请打开命令窗口并输入 `dotnet --version`... 答案应该是 **1.0.0-preview2-003121** 之类的...
Linux
在 Linux 上安装可能有点复杂(取决于发行版),因此微软在此处汇总了一系列页面来帮助您:.NET Core 安装。
选择您的发行版并暂时只遵循第一部分的说明...
为了确保,您必须对 Linux 终端/安装/升级的工作方式有一定程度的了解,但只是一定程度...
要检查安装,您也必须在此处(终端)运行相同的命令——`dotnet --version`。答案也应该相同。
如果您此时遇到错误,您暂时需要自行解决,但我可以提供此命令(终端)来帮助查找一些可能的问题
find /opt/dotnet -name '*.so' -type f -print | xargs ldd | grep 'not found'
这将列出所有缺失的库,您可以运行适合您的发行版的安装/更新命令(`/opt/dotnet` 路径是您安装 .NET Core 包的位置——如果不同,请相应更改)。
奖励 - 您可能使用的编辑器
如果您使用 Windows,我无法为您提供比 Visual Studio(可能是 Community 2015)更好的选择。此外,如果您是 hardcore Linux 开发人员,很难让您离开您最喜欢的编辑器(vim、emacs、gedit 等),但对于介于两者之间的情况,我想向您介绍 Visual Studio Code(Visual Studio Code)...
VS Code 是一个基于浏览器(嵌入式)的代码编辑器,封装在一个能够处理项目和扩展的包装器中,具有内置的调试器平台、Git 支持和智能感知。
VS Code 实际上是迈向跨平台 Visual Studio 的第一步(根据路线图,它将在下一个版本中支持标准的 Visual Studio 项目,而不是当前基于文件夹的带有 json 项目文件的 workspace——预计在 2016 年第四季度/2017 年第一季度)。它轻巧简单,但在所有支持的平台上调试功能强大...
我将向您展示 C# 代码... VS Code 默认只安装对 node.js、JavaScript 和 TypeScript 的支持,因此您必须为这个示例安装 C# 扩展... 请参阅文档了解如何操作...
最后一点,只是为了让您流口水... 和 Visual Studio 一样,您也可以为 VS Code 编写扩展!
现在试试看...
真正的魔术
这一部分实际上非常简单——因为我无意用 .NET Core 重写一些 3D 图形引擎。我要向您展示的是这些
- 创建一个简单的控制台(`Hello World`)应用程序
- 添加 .NET 中众所周知的 `Process` 类来打印加载的模块
- 在 Fedora 盒子上编译、运行——偶尔调试——它
- 将编译后的程序集移动到 Windows 盒子上并运行它——原样不动
创建应用程序
此时,您可以轻松地使用命令行创建项目(由 Json 文件定义)。如前所述,将来将支持众所周知的 Visual Studio 项目格式,并将添加更多创建选项(还有手动选项,但...)。
要创建简单的“`Hello World`”应用程序,请遵循以下步骤
- 打开 VS Code
- 打开内置终端(CTRL+`,或从视图菜单)
- 运行这些命令
mkdir hwapp
cd hwapp
dotnet new
dotnet restore
dotnet run
(这些代码行源自微软,来自此处:.NET Core - 初始化一些代码)
- 现在打开项目(VS Code 使用基于文件夹的工作区,所以您实际上必须打开包含文件夹),使用文件/打开文件夹... 菜单。
升级代码
using System;
using System.Diagnostics;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Process oProcess = Process.GetCurrentProcess( );
Console.WriteLine( string.Format( "Process: {0} ({1})",
oProcess.ProcessName, oProcess.Id ) );
Console.WriteLine( );
Console.WriteLine( "MODULES:" );
Console.WriteLine( "________" );
foreach ( ProcessModule oModule in oProcess.Modules )
{
Console.WriteLine( string.Format( "\t{0} ({1})",
oModule.ModuleName, oModule.FileName ) );
}
}
}
}
正如承诺的那样,一个非常简单的代码更改。但是,您可以注意到没有任何迹象表明它是 .NET Core 的代码。这段代码——原样不动——也可以在完全功能的 .NET Framework 下编译(我有没有提到 .NET Core 与 .NET Framework 兼容?)。
您还必须注意编辑窗口顶部的通知——阅读它们并相应地做出响应,它们大多是关于缺少的东西,如调试定义和错误...
要构建应用程序,您可以再次使用终端(`dotnet build`)或预定义的构建任务,该任务可以通过 CTRL+SHIFT+B 调用。
此时,应用程序已准备好运行,您可以使用调试器——查看其工作原理、内置终端或外部终端来运行它。要从终端运行它,请导航到包含应用程序的文件夹并键入 `dotnet run`。您将获得应用程序加载的模块列表...
到处运行
我们到这里了。现在我们将把应用程序——编译后的版本——移动到 Windows 盒子上,看看它在那里也能运行...
在 Fedora (Linux) 盒子上,您将在“`bin\Debug\netcoreapp1.0`”文件夹中找到二进制文件。您需要复制的是 DLL(是的!在 .NET Core 下,即使是控制台应用程序也编译为 DLL 而不是 EXE!)和“`runtimeconfig.json`”文件... 将这两个文件放在您在 Windows 盒子上选择的同一文件夹中。
打开命令窗口并导航到您存储二进制文件的文件夹。
输入神奇的命令“`dotnet run`”并享受!
(比较 Fedora (Linux) 和 Windows 盒子上的列表是一件有趣的事情。)
关注点
对我来说,能够一次性在我的电脑上编译我的代码(以及调试、测试和编写),然后将其分发到各种操作系统,这真的令人兴奋。
我在这里展示的示例非常简单,但发挥您的想象力,您将看到各种可能性... 另外请记住,.NET Core 及其周边工具都是开源的,您可以有所作为!