C# 与 .NET 跨平台开发实战(第一章:开发环境搭建与.NET概述-上篇) 2026/7/30 10:06:37 C# 与 .NET 跨平台开发实战(第一章:开发环境搭建与.NET概述-上篇)引言在当今多平台并行的软件开发世界,跨平台开发已成为刚需。C# 与 .NET 自 2016 年 .NET Core 发布以来,已从仅限 Windows 的封闭生态,进化为支持 Windows、Linux、macOS、容器、移动设备等全平台框架。本文是实战系列的第一章上篇,我们将从零搭建跨平台开发环境,并通过可运行代码理解 .NET 的核心概念。## 环境搭建:选择你的武器### 操作系统与 SDK 安装跨平台开发的第一个挑战是环境一致性。我们使用 .NET SDK 8.0(LTS 版本),它支持以下主流平台:-Windows:从dotnet.microsoft.com 下载安装程序,安装后打开命令提示符验证。-macOS:使用 Homebrew (brew install dotnet-sdk) 或手动安装。-Linux (Ubuntu 22.04):通过 Microsoft 仓库安装。安装完成后,在终端执行以下命令确认版本:bashdotnet --version# 输出示例:8.0.100### 项目模板创建.NET CLI 是跨平台开发的瑞士军刀。我们创建一个控制台应用来验证环境:bash# 创建新项目dotnet new console -n HelloWorld# 进入目录cd HelloWorld# 运行项目dotnet run如果你看到 “Hello, World!” 输出,说明环境搭建成功。## .NET 核心概念:运行时、SDK 与 CLR在编写代码前,理解三个关键组件至关重要:1.SDK (Software Development Kit):包含编译器、调试器、项目模板等开发工具。2.Runtime:运行已编译 .NET 应用所需的环境,包括dotnet命令和核心库。3.CLR (Common Language Runtime):负责执行托管代码、垃圾回收、类型安全等。一个常见误区是认为 .NET 框架等同于 Windows-only。实际上,.NET 8 使用CoreCLR运行时,它完全跨平台。## 实战代码示例 1:跨平台系统信息采集让我们编写第一个可运行代码,展示 .NET 如何识别当前操作系统并执行平台特定操作。csharpusing System;using System.Runtime.InteropServices;class Program{ static void Main() { // 获取操作系统描述(跨平台) Console.WriteLine($"当前操作系统: {RuntimeInformation.OSDescription}"); Console.WriteLine($"架构: {RuntimeInformation.OSArchitecture}"); Console.WriteLine($"进程架构: {RuntimeInformation.ProcessArchitecture}"); // 根据平台执行不同操作 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { Console.WriteLine("检测到 Windows 平台,准备调用 Windows API"); // 这里可以调用 Windows 特有的 COM 组件或 P/Invoke } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { Console.WriteLine("检测到 Linux 平台,读取 /etc/os-release"); // 跨平台文件路径处理 string osReleasePath = "/etc/os-release"; if (System.IO.File.Exists(osReleasePath)) { string content = System.IO.File.ReadAllText(osReleasePath); Console.WriteLine($"Linux 发行版信息: {content.Substring(0, 100)}..."); } } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { Console.WriteLine("检测到 macOS 平台,使用 Foundation 框架"); // 调用 macOS 特有的 Objective-C 绑定 } // 跨平台环境变量读取 string path = Environment.GetEnvironmentVariable("PATH"); Console.WriteLine($"\n环境变量 PATH (前200字符): {path?.Substring(0, Math.Min(200, path.Length))}"); }}运行结果示例(在 Linux 上):当前操作系统: Linux 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023架构: X64进程架构: X64检测到 Linux 平台,读取 /etc/os-releaseLinux 发行版信息: PRETTY_NAME="Ubuntu 22.04.3 LTS"...环境变量 PATH (前200字符): /usr/local/sbin:/usr/local/bin:...这段代码展示了三个跨平台开发要点:-RuntimeInformation类提供平台无关的检测机制- 条件编译 (#if) 可以替代运行时检测,但这里我们使用运行时检测来演示灵活性- 跨平台路径处理(Linux 使用正斜杠,Windows 使用反斜杠,但 .NET 的Path类自动处理)## .NET 项目结构解析使用dotnet new创建的项目包含:-Program.cs:入口文件-HelloWorld.csproj:项目文件(XML 格式)-bin/和obj/:编译输出目录(自动生成)在HelloWorld.csproj中,关键配置如下:xml<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup></Project>-TargetFramework指定目标框架(net8.0表示 .NET 8)-ImplicitUsings自动引入常用命名空间(如System、System.IO)-Nullable启用可空引用类型(现代 C# 特性)## 实战代码示例 2:跨平台文件操作与 JSON 序列化第二个示例演示 .NET 在不同平台下处理文件路径和数据的差异。csharpusing System;using System.IO;using System.Text.Json;// 定义一个简单的数据模型public class AppConfig{ public string AppName { get; set; } = "MyCrossPlatformApp"; public int MaxThreads { get; set; } = 4; public bool EnableLogging { get; set; } = true;}class Program{ static void Main() { // 1. 跨平台路径构建:使用 Path.Combine 而非字符串拼接 string configDir = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyApp" ); Console.WriteLine($"配置文件目录: {configDir}"); // 2. 创建目录(跨平台) Directory.CreateDirectory(configDir); string configFile = Path.Combine(configDir, "config.json"); // 3. 序列化配置对象为 JSON var config = new AppConfig { AppName = "跨平台演示应用", MaxThreads = Environment.ProcessorCount, // 动态获取CPU核心数 EnableLogging = true }; string json = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true }); // 4. 写入文件 File.WriteAllText(configFile, json); Console.WriteLine($"配置已保存至: {configFile}"); // 5. 从文件读取并反序列化 if (File.Exists(configFile)) { string readJson = File.ReadAllText(configFile); AppConfig loadedConfig = JsonSerializer.Deserialize<AppConfig>(readJson); Console.WriteLine($"\n读取的配置:"); Console.WriteLine($" 应用名: {loadedConfig.AppName}"); Console.WriteLine($" 最大线程数: {loadedConfig.MaxThreads}"); Console.WriteLine($" 日志启用: {loadedConfig.EnableLogging}"); } // 6. 演示跨平台路径分隔符 Console.WriteLine($"\n路径分隔符: {Path.DirectorySeparatorChar}"); Console.WriteLine($"在 Windows 上为 \\,在 Linux/macOS 上为 /"); }}运行结果示例(在 macOS 上):配置文件目录: /Users/username/AppData/Roaming/MyApp配置已保存至: /Users/username/AppData/Roaming/MyApp/config.json读取的配置: 应用名: 跨平台演示应用 最大线程数: 8 日志启用: True路径分隔符: /在 Windows 上为 \,在 Linux/macOS 上为 /## 总结本文从实战角度完成了跨平台开发的第一步:1.环境搭建:成功安装 .NET SDK 并验证了dotnet run命令。2.核心概念:理解了 SDK、Runtime、CLR 的职责,以及 .NET 8 的跨平台本质。3.代码实战:通过两个可运行示例,展示了平台检测、文件路径处理、JSON 序列化等核心技能。跨平台开发的关键在于使用 .NET 的抽象层(如RuntimeInformation、Path、Environment),而非直接依赖操作系统 API。下篇将深入探讨NuGet 包管理与依赖注入,敬请期待。
C# 与 .NET 跨平台开发实战(第一章:开发环境搭建与.NET概述-上篇)引言在当今多平台并行的软件开发世界,跨平台开发已成为刚需。C# 与 .NET 自 2016 年 .NET Core 发布以来,已从仅限 Windows 的封闭生态,进化为支持 Windows、Linux、macOS、容器、移动设备等全平台框架。本文是实战系列的第一章上篇,我们将从零搭建跨平台开发环境,并通过可运行代码理解 .NET 的核心概念。## 环境搭建:选择你的武器### 操作系统与 SDK 安装跨平台开发的第一个挑战是环境一致性。我们使用 .NET SDK 8.0(LTS 版本),它支持以下主流平台:-Windows:从dotnet.microsoft.com 下载安装程序,安装后打开命令提示符验证。-macOS:使用 Homebrew (brew install dotnet-sdk) 或手动安装。-Linux (Ubuntu 22.04):通过 Microsoft 仓库安装。安装完成后,在终端执行以下命令确认版本:bashdotnet --version# 输出示例:8.0.100### 项目模板创建.NET CLI 是跨平台开发的瑞士军刀。我们创建一个控制台应用来验证环境:bash# 创建新项目dotnet new console -n HelloWorld# 进入目录cd HelloWorld# 运行项目dotnet run如果你看到 “Hello, World!” 输出,说明环境搭建成功。## .NET 核心概念:运行时、SDK 与 CLR在编写代码前,理解三个关键组件至关重要:1.SDK (Software Development Kit):包含编译器、调试器、项目模板等开发工具。2.Runtime:运行已编译 .NET 应用所需的环境,包括dotnet命令和核心库。3.CLR (Common Language Runtime):负责执行托管代码、垃圾回收、类型安全等。一个常见误区是认为 .NET 框架等同于 Windows-only。实际上,.NET 8 使用CoreCLR运行时,它完全跨平台。## 实战代码示例 1:跨平台系统信息采集让我们编写第一个可运行代码,展示 .NET 如何识别当前操作系统并执行平台特定操作。csharpusing System;using System.Runtime.InteropServices;class Program{ static void Main() { // 获取操作系统描述(跨平台) Console.WriteLine($"当前操作系统: {RuntimeInformation.OSDescription}"); Console.WriteLine($"架构: {RuntimeInformation.OSArchitecture}"); Console.WriteLine($"进程架构: {RuntimeInformation.ProcessArchitecture}"); // 根据平台执行不同操作 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { Console.WriteLine("检测到 Windows 平台,准备调用 Windows API"); // 这里可以调用 Windows 特有的 COM 组件或 P/Invoke } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { Console.WriteLine("检测到 Linux 平台,读取 /etc/os-release"); // 跨平台文件路径处理 string osReleasePath = "/etc/os-release"; if (System.IO.File.Exists(osReleasePath)) { string content = System.IO.File.ReadAllText(osReleasePath); Console.WriteLine($"Linux 发行版信息: {content.Substring(0, 100)}..."); } } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { Console.WriteLine("检测到 macOS 平台,使用 Foundation 框架"); // 调用 macOS 特有的 Objective-C 绑定 } // 跨平台环境变量读取 string path = Environment.GetEnvironmentVariable("PATH"); Console.WriteLine($"\n环境变量 PATH (前200字符): {path?.Substring(0, Math.Min(200, path.Length))}"); }}运行结果示例(在 Linux 上):当前操作系统: Linux 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023架构: X64进程架构: X64检测到 Linux 平台,读取 /etc/os-releaseLinux 发行版信息: PRETTY_NAME="Ubuntu 22.04.3 LTS"...环境变量 PATH (前200字符): /usr/local/sbin:/usr/local/bin:...这段代码展示了三个跨平台开发要点:-RuntimeInformation类提供平台无关的检测机制- 条件编译 (#if) 可以替代运行时检测,但这里我们使用运行时检测来演示灵活性- 跨平台路径处理(Linux 使用正斜杠,Windows 使用反斜杠,但 .NET 的Path类自动处理)## .NET 项目结构解析使用dotnet new创建的项目包含:-Program.cs:入口文件-HelloWorld.csproj:项目文件(XML 格式)-bin/和obj/:编译输出目录(自动生成)在HelloWorld.csproj中,关键配置如下:xml<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup></Project>-TargetFramework指定目标框架(net8.0表示 .NET 8)-ImplicitUsings自动引入常用命名空间(如System、System.IO)-Nullable启用可空引用类型(现代 C# 特性)## 实战代码示例 2:跨平台文件操作与 JSON 序列化第二个示例演示 .NET 在不同平台下处理文件路径和数据的差异。csharpusing System;using System.IO;using System.Text.Json;// 定义一个简单的数据模型public class AppConfig{ public string AppName { get; set; } = "MyCrossPlatformApp"; public int MaxThreads { get; set; } = 4; public bool EnableLogging { get; set; } = true;}class Program{ static void Main() { // 1. 跨平台路径构建:使用 Path.Combine 而非字符串拼接 string configDir = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyApp" ); Console.WriteLine($"配置文件目录: {configDir}"); // 2. 创建目录(跨平台) Directory.CreateDirectory(configDir); string configFile = Path.Combine(configDir, "config.json"); // 3. 序列化配置对象为 JSON var config = new AppConfig { AppName = "跨平台演示应用", MaxThreads = Environment.ProcessorCount, // 动态获取CPU核心数 EnableLogging = true }; string json = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true }); // 4. 写入文件 File.WriteAllText(configFile, json); Console.WriteLine($"配置已保存至: {configFile}"); // 5. 从文件读取并反序列化 if (File.Exists(configFile)) { string readJson = File.ReadAllText(configFile); AppConfig loadedConfig = JsonSerializer.Deserialize<AppConfig>(readJson); Console.WriteLine($"\n读取的配置:"); Console.WriteLine($" 应用名: {loadedConfig.AppName}"); Console.WriteLine($" 最大线程数: {loadedConfig.MaxThreads}"); Console.WriteLine($" 日志启用: {loadedConfig.EnableLogging}"); } // 6. 演示跨平台路径分隔符 Console.WriteLine($"\n路径分隔符: {Path.DirectorySeparatorChar}"); Console.WriteLine($"在 Windows 上为 \\,在 Linux/macOS 上为 /"); }}运行结果示例(在 macOS 上):配置文件目录: /Users/username/AppData/Roaming/MyApp配置已保存至: /Users/username/AppData/Roaming/MyApp/config.json读取的配置: 应用名: 跨平台演示应用 最大线程数: 8 日志启用: True路径分隔符: /在 Windows 上为 \,在 Linux/macOS 上为 /## 总结本文从实战角度完成了跨平台开发的第一步:1.环境搭建:成功安装 .NET SDK 并验证了dotnet run命令。2.核心概念:理解了 SDK、Runtime、CLR 的职责,以及 .NET 8 的跨平台本质。3.代码实战:通过两个可运行示例,展示了平台检测、文件路径处理、JSON 序列化等核心技能。跨平台开发的关键在于使用 .NET 的抽象层(如RuntimeInformation、Path、Environment),而非直接依赖操作系统 API。下篇将深入探讨NuGet 包管理与依赖注入,敬请期待。