首页 > 编程语言 >dotnet-exec 让 C# 程序更简单【转】

dotnet-exec 让 C# 程序更简单【转】

时间:2023-04-11 10:02:48浏览次数:41  
标签:profile exec C# 代码 -- dotnet WeihanLi

Intro

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

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

工作流程分为三步:

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

  • 代码编译: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

 

转:https://mp.weixin.qq.com/s/OIuCvC-Yg4Joki4PCnjCdA

标签:profile,exec,C#,代码,--,dotnet,WeihanLi
From: https://www.cnblogs.com/fanfan-90/p/17305220.html

相关文章

  • ubuntu 编译出现错误fatal error: bits/libc-header-start.h: No such file or direct
    在ubuntugcc编译程序出现错误fatalerror:bits/libc-header-start.h:Nosuchfileordirectory表明缺少库环境。解决方法aptupdateapt-getinstallgcc-multilib成功编译......
  • python3写csv中文文件,可以直接excel打开
    写出python3代码:将如下数据转为windowsexcel文件。 importcsvdata=[[1010205,'2022/11/23','R染(Inception)攻击','T89','在远程系统的启动文件登录后可以自动执行恶意脚本或可执行文件。','例:copyrogramData\Microsoft\W\Programs\StartUp',4,85,......
  • git pull时,提示Your local changes to the following files would be overwritten by
    问题描述:本地修改了代码后,执行“gitpull”命令时,无法更新代码,并报错提示:“Yourlocalchangestothefollowingfileswouldbeoverwrittenbymerge” 问题原因:是因为本地修改的代码与git服务器的代码冲突导致。如果不冲突,会自动更新合并代码。 gitpull冲突的解决办......
  • dataclass
    [数据类(dataclass)](Python3.7+中的数据类(指南)–真正的Python(realpython.com))目录引入数据类的替代项数据类基础默认值类型提示添加方法更灵活的数据类高级默认值数据类的字符串表示卡片比较不可变数据类继承优化数据类引入数据类是通常主要包含数据的类,尽管实际上......
  • Rocky Linux 9 Wazuh 部署
    1、DockerCE安装参考:https://www.cnblogs.com/a120608yby/p/9883175.html2、DockerCompose安装参考:https://www.cnblogs.com/a120608yby/p/14582853.html3、主机参数优化#编辑/etc/sysctl.conf#vim/etc/sysctl.conf...vm.max_map_count=262144...#使配置......
  • python写入数据到oracle clob字段
     环境:Python:3.6.5  #!/usr/bin/envpython#coding=utf-8importos,json,urllib,datetime,shutilimporttimeimportcx_Oraclegl_mysql_server="192.168.1.118"gl_user_name="hxl"gl_password="mysql"gl_db_name="db_t......
  • Composer命令全解析
    常用命令镜像#配置中国镜像composerconfig-grepo.packagistcomposerhttps://packagist.phpcomposer.com#配置其他厂商镜像#阿里云(好像说停用了)composerconfig-grepo.packagistcomposerhttps://mirrors.aliyun.com/composer/#腾讯composerconfig-grepo.packag......
  • SEE 08 Best alternative & economic life
    Bestalternative&economiclife8.1ProposalRelationshipsIndependentproposal&dependentproposalFormsofdependencyCo-dependent.Mutuallyexclusive.Contingent8.2DependentProposalsCo-DependentProposalswhenselectinganyonefromtha......
  • 全面的VCL界面控件DevExpress VCL v22.2.5全新发布
    DevExpressVCL Controls是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。DevExpressVCLv22.2.5正式版下载更......
  • 如何在EasyCVR视频融合平台中播放MP4格式的视频文件?
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台可支持多协议、多类型的设备接入,可覆盖市面上绝大多数的视频源设备,包括:IPC、NVR、视频编码器、移动执法仪、应急布控球、移动警用单兵、智能终端、无人机、车机设备、智能一体机等。今天我们来分享......