Featured image of post 单文件运行C#代码

单文件运行C#代码

基于文件的程序允许单个文件作为普通项目独立存在。不再需要.csproj

解锁.NET 新姿势:基于文件的程序特性深度解析与实战

在.NET 的世界里,新项目的创建和运行往往离不开.csproj项目文件,从编写代码到调试运行,需要一系列繁琐的步骤。但随着.NET 技术的不断演进,基于文件的程序(File-based programs) 这一新特性的出现,打破了这一传统模式,为开发者带来了更加便捷、高效的开发体验。

基于文件的程序特性概述

基于文件的程序,简单来说,就是将部分 MSBuild 项目功能嵌入到 C# 代码中,允许开发者直接运行单个 C# 文件,就像运行一个完整的项目一样。在以往,运行 C# 代码通常需要先创建一个项目,编写 .csproj 文件来配置项目的各种属性,如引用的包、目标框架等。而基于文件的程序则无需这些复杂的操作,它通过在 C# 源文件中添加特殊的 #: 指令,在内存中生成一个 “虚拟项目”,然后将这个 “虚拟项目” 传递给 MSBuild 进行构建和运行。

其背后的运行机制是:当使用 dotnet run 命令运行一个 C# 文件时,命令行会解析源文件中的 #: 指令,根据这些指令在内存中构建一个 C# 项目 XML 文档,这个文档就相当于一个常规项目的 .csproj 文件。随后,MSBuild 会基于这个内存中的项目文档进行编译和运行,使得单个文件能够像完整项目一样执行 。

应用示例详解

示例 1:经典 Hello World

1
2
3
// HelloWorld.cs
#:r "System.Net.Http"
Console.WriteLine("Hello, World!");

在这个简单示例中,#:r "System.Net.Http" 是一个 #: 指令,它用于引用 System.Net.Http 程序集。虽然代码中没有传统的项目文件配置,但通过这条指令,我们为程序添加了所需的引用。在命令行中进入该文件所在目录,执行 dotnet run HelloWorld.cs,就能看到熟悉的 “Hello, World!” 输出。这展示了基于文件的程序最基础的运行方式,仅需一个 C# 文件和简单指令,即可快速运行代码。

示例 2:引用外部 NuGet 包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// NewtonsoftJsonExample.cs
#:package Newtonsoft.Json 13.0.1
using Newtonsoft.Json;

class Program
{
    static void Main()
    {
        var person = new { Name = "Alice", Age = 30 };
        var json = JsonConvert.SerializeObject(person);
        Console.WriteLine(json);
    }
}

在这个示例中,#:package Newtonsoft.Json 13.0.1 指令用于引入 Newtonsoft.Json 包及其指定版本。引入后,代码中就能使用 Newtonsoft.Json 提供的功能,如将对象序列化为 JSON 字符串。运行时,dotnet run 命令会根据该指令自动下载并引用所需的 NuGet 包,无需手动在项目文件中添加包引用,极大地简化了使用外部包的流程 。

示例 3:多文件协作

假设我们有一个简单的数学计算项目,包含两个文件:Calculator.csProgram.cs

Calculator.cs 文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Calculator.cs
namespace MathUtils
{
    public static class Calculator
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
    }
}

Program.cs 文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Program.cs
#:r "System.Net.Http"
using MathUtils;

class Program
{
    static void Main()
    {
        int result = Calculator.Add(5, 3);
        Console.WriteLine($"The result of addition is: {result}");
    }
}

在基于文件的程序中,无需手动在项目文件中配置文件引用关系。当使用 dotnet run Program.cs 命令运行时,SDK CLI 会自动解析 Program.cs 所在目录树中的所有 .cs 文件,将 Calculator.cs 包含在编译过程中,使得不同文件之间能够顺利协作,实现复杂的功能 。

与传统项目模式的对比优势

  1. 降低入门门槛
    对于初学者来说,传统的 .csproj 项目文件配置复杂,包含众多属性和节点,容易让新手感到困惑。而基于文件的程序模式,只需关注代码本身和简单的 #: 指令,无需深入了解项目文件配置,能够更快地编写和运行代码,降低了学习成本。

  2. 快速原型开发
    在开发初期进行原型设计时,往往需要快速验证想法和功能。基于文件的程序无需创建完整项目结构,直接编写单个文件并运行,能够大大提高开发效率,快速迭代原型。

  3. 简化小型工具开发
    对于一些简单的小型工具或脚本,使用传统项目模式显得过于繁琐。基于文件的程序可以用最少的配置和步骤实现功能,使代码更加简洁、轻便,便于维护和管理。

使用注意事项

虽然基于文件的程序带来了诸多便利,但在使用过程中也有一些需要注意的地方:

  • 目前基于文件的程序在功能上还存在一定限制,例如对某些复杂的项目配置和构建自定义支持不够完善。
  • 由于其依赖于 #: 指令来配置项目属性,指令的语法和使用规则需要开发者熟练掌握,否则可能会出现引用错误或构建失败等问题。
  • 在团队协作开发中,基于文件的程序可能会因为成员使用不同版本的 .NET SDK 而导致运行结果不一致,需要统一开发环境。

以上就是对 .NET 基于文件的程序特性的详细介绍和应用示例。这一特性为开发者提供了更灵活高效的开发方式,无论是初学者快速上手,还是经验丰富的开发者进行快速开发,都能发挥重要作用。不妨亲自尝试,感受它带来的便捷!如果你在使用过程中有新的发现或遇到问题,欢迎一起交流探讨。

Built with Hugo
Theme Stack designed by Jimmy