故事:
- 用vs2019发布.net core3.1项目时选择了独立部署模式,
- 突然很好奇想扒一扒在不依赖框架的情况下程序是怎么运行的?
- 进而又想到在Linux下程序是不能直接调用DLL文件的,.net core发布后的项目在Linux下又是怎么运行的?
- 最后更想去了解.net core发布在Linux系统运行的文件与发布在Windows系统的文件有什么不同,是怎么做到的一套代码,到处运行的?
参考:
.netcore在linux下使用P/invoke方式调用linux动态库
测试项目:控制台应用程序
win-x64发布
发布时选择
部署模式:独立
目标运行时:win-x86
发布后文件
文件类型:
- Json文件
- exe文件
- DM文件
- pdb文件
- DLL文件
从大到小排序,发现几个重要的文件:
- System.Private.CoreLib.dll:基础类库
- coreclr.dll:公用语言运行时
- clrjit.dll:实时编译器
- 自己编码以及引用到的DLL文件
- ???使用反编译工具发现System.Private.CoreLib.dll里面居然包含了各种dll?然后coreclr.dll里面居然是没有dll文件,只有dos头、文件头、可选头、节#,与我想象的相反啊,难道coreclr.dll只是一个中间引用,核心的都在System.Private.CoreLib.dll中?
Runtime文件:
CLR文件:
应用程序是怎么运行的
参考:c#原理:c#代码是怎么运行的、实例化时发生了什么、静态对象(类、方法、变量、属性)的原理
DLL/EXE=>CLR/JIT=>机器码
双击:ConsoleApp1.exe
linux-x64发布
发布时选择
发布后文件
文件类型:黑色的是win-x86发布有的文件类型,红色的是win-x86发布没有的文件类型
- Json文件
- DM文件
- PDB文件
- DLL文件
- 没有exe应用程序,,linux系统不支持exe程序,系统不一样
- .a文件:LINUX系统中的静态链接库文件
- SO文件:是Linux下的程序bai函数库,即编译好的可以供其他程序使用的代码和数据,类似于(又不仅仅)windows下的DLL文件
- 没扩展名的文件,linux也是可以启动的,因为linux应用程序没有固定的扩展名,只要是支持的都能启动
- 在linux上,这个没有扩展名的ConsoleApp1就是程序的入口
应用程序是怎么运行的
先安装icu库:yum install icu
然后程序授权:chmod 777 ./ConsoleApp1
最后运行程序:./ConsoleApp1
ConsoleApp1程序会通过.so文件调用对应的.dll文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2021-08-06 wos 文献被引_全世界最权威的文献检索工具,这6个检索技巧必须要掌握!
2021-08-06 研究方法|用CiteSpace进行科学文献可视化分析
2018-08-06 java环境变量的配置
2013-08-06 C#串口通信
2008-08-06 C#中动态执行C#脚本
2008-08-06 线程安全
2008-08-06 asp.net缓存状态管理