百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

dotnet-exec 让 C# 程序更简单(c#.net)

liuian 2025-03-23 21:08 20 浏览

dotnet-exec 让 C# 程序更简单

Intro

dotnet-exec是一个可以执行 C# 程序而不需要项目文件的命令行工具,并且你可以指定自定义的入口方法不仅仅是Main方法

在 python/NodeJs 里,可以使用python xx.py/node xx.js来运行代码,在 C# 中一般是需要项目文件才能dotnet run运行代码,这对于一些比较简单的代码来说会显得麻烦很多,而dotnet-exec则可以用来简化这一场景,使得我们可以没有项目文件也可以运行,我们就可以直接dotnet-execxx.cs除此之外我们也可以自定义代码的入口方法不限于Main方法,而且我们可以直接执行源代码和远程文件代码

How it works

工作流程分为三步:

  • 获取代码:目前支持本地代码、远程代码以及原始代码

  • 代码编译:Roslyn 完成代码动态编译

  • 代码执行:基于 AssemblyLoadContext 的代码执行

核心实现是基于 Roslyn 来完成动态编译

编译的时候分成三种情况

  • 一种是代码是有Main方法的Console应用,直接执行 Main 方法即可

  • 一种是没有 Main 方法的 DLL,需要自定义入口方法,执行自定义的入口方法

  • 最后是Script代码是由Roslyn的Scripting功能进行支持进行编译和执行

Install/Update

最新的稳定版本:

dotnet tool update -g dotnet-execute

最新的预览版本:

dotnet tool update -g dotnet-execute --prerelease

Docker 支持

使用 docker 执行

docker run --rm weihanli/dotnet-exec:latest dotnet-exec "1+1"
docker run --rm weihanli/dotnet-exec:latest dotnet-exec "Guid.NewGuid()"
docker run --rm --pull=always weihanli/dotnet-exec:latest dotnet-exec "ApplicationHelper.RuntimeInfo"

完整的 tag 列表请参考 https://hub.docker.com/r/weihanli/dotnet-exec/tags

除了 latest tag 你也可以使用 0.12.0 这样的版本 tag,docker 版本 tag 只发布稳定版本

Examples

Get started

执行本地文件:

dotnet-exec HttpPathJsonSample.cs

执行本地文件并且自定义入口方法:

dotnet-exec 'HttpPathJsonSample.cs' --entry MainTest

详细示例:

执行远程文件:

dotnet-exec 'https://github.com/WeihanLi/SamplesInPractice/blob/master/net7Sample/Net7Sample/ArgumentExceptionSample.cs'

远程文件这里做了一些优化,会将 Github/Gist/Gitee上的文件地址自动转换成原始内容地址,以下两种方式效果一样

执行原始代码:

dotnet-exec 'Console.WriteLine(1+1);'

执行原始脚本:

dotnet-exec 'script:1+1'
dotnet-exec 'Guid.NewGuid()'

References

执行原始代码并自定义程序集引用:

NuGet 包引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "nuget: WeihanLi.Npoi,2.3.0" -u "WeihanLi.Npoi"

本地 dll 引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "./out/WeihanLi.Npoi.dll" -u "WeihanLi.Npoi"

本地目录下的 dll 引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "folder: ./out" -u "WeihanLi.Npoi"

本地项目引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump();' -r "project: ./WeihanLi.Npoi.csproj" -u "WeihanLi.Npoi"

框架引用:

dotnet-exec 'WebApplication.Create().Run();' --reference 'framework:web'

使用--web一个选项来添加 web 框架引用:

dotnet-exec 'WebApplication.Create().Run();' --web

一行代码实现 web api

一行代码使用 winform 弹出窗口

Usings

执行原始代码并且自定义命名空间引用:

dotnet-exec 'WriteLine(1+1);' --using "static System.Console"

执行原始脚本并且自定义命名空间引用:

dotnet-exec 'CsvHelper.GetCsvText(new[]{1,2,3}).Dump()' -r "nuget:WeihanLi.Npoi,2.4.2" -u WeihanLi.Npoi

其他示例

执行原始代码并且指定更多依赖:

dotnet-exec 'typeof(LocalType).FullName.Dump();' --ad FileLocalType2.cs
dotnet-exec 'typeof(LocalType).FullName.Dump();' --addition FileLocalType2.cs

执行原始代码并且指定从项目文件中提取 using 信息和 reference 信息:

dotnet-exec 'typeof(LocalType).FullName.Dump();' --project ./Sample.csproj

执行本地文件并指定启用预览特性:

dotnet-exec RawStringLiteral.cs --preview

Config Profile

你可以自定义常用的配置到一个 profile 配置里以方便重复使用,使用帮助可以参考命令行帮助

列出所有可用的 profile 配置:

dotnet-exec profile ls

配置一个 profile:

dotnet-exec profile set web -r "nuget:WeihanLi.Web.Extensions" -u 'WeihanLi.Web.Extensions' --web --wide false

获取一个 profile 配置详情:

dotnet-exec profile get web

移除不需要的 profile 配置:

dotnet-exec profile rm web

执行代码时指定某一个 profile 配置:

dotnet-exec 'WebApplication.Create().Chain(_=>_.MapRuntimeInfo()).Run();' --profile web
执行代码时指定某一个 profile 配置并且移除配置中的某一个 using:
dotnet-exec 'WebApplication.Create().Run();' --profile web --using '-WeihanLi.Extensions'


More

  • https://github.com/WeihanLi/dotnet-exec
  • https://www.nuget.org/packages/dotnet-execute
  • https://hub.docker.com/r/weihanli/dotnet-exec
  • https://github.com/WeihanLi/dotnet-exec/blob/main/docs/slides/dotnet-conf-china-2022-dotnet-exec_makes_csharp_more_simple.pdf


相关推荐

教你把多个视频合并成一个视频的方法

一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...

Java APT_java APT 生成代码

JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...

Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器

在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...

挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?

如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...

五年后,谷歌还在全力以赴发展 Kotlin

作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...

kotlin和java开发哪个好,优缺点对比

Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...

移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?

掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...

颜值非常高的XShell替代工具Termora,不一样的使用体验!

Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...

预处理的底层原理和预处理编译运行异常的解决方案

若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...

为“架构”再建个模:如何用代码描述软件架构?

在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...

深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型

2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...

比分网开发技术栈与功能详解_比分网有哪些

一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...

设计模式之-生成器_一键生成设计

一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

构建第一个 Kotlin Android 应用_kotlin简介

第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...