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
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