MONO 如何打包 .NET程序独立运行(winform篇)
.NET程序独立运行是指运行.NET的电脑上,不需要安装.NET框架。
.NET程序集“独立运行”并非真正的独立,它是运行在mono运行时基础之上的。由于这个运行时可以独立存在,所以,我们不需要在目标机上安装.NET框架。
一,嵌入或未嵌入.NET程序集的用C/C++语言写的主程序,这个主程序负责对mono运行时进行操作。同时还可配合.NET完成其它的任务(比如提供函数供.NET使用);
二,mono的.NET运行时,这是一个动态库文件(mono同时提供了静态库),是.NET程序集运行的关键条件。
三,MONO运行时的配置文件或文件夹(并不一定需要)。
四,外部的程序集没有嵌入到C程序中的其它的相关.NET程序集。
“独立运行”的过程是:
C语言通过mono提供的运行时api,调用mono运行时有关函数,通过mono运行时加载并运行.NET程序。
即:
C语言程序(your.exe) --à mono的.NET运行时(libmonosgen-2.0.dll) --à .NET程序集
libmonosgen-2.0.dll,即是.NET程序集的运行条件,也是.NET程序集与C程序之间数据交流、函数互调的桥梁。
好了,有了以上的理论知识,下面我们就开始实践一下吧
1.使用Xbuid命令编译

2.把编译后的net 运行文件 写入到一个 char[]变量中,并记下这个程序集的名称,大小
mkpack H:\Csharp\Mono\Test\TestBuild\TestBuild\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe
会生成3个文件

data.c 是.NET程序集的二进制内容
data_.c 是为了文件用户调用的针对data.c的函数和变量
data.h 是data_.c的头文件,是用户c源码必须的。
3.将编译data.c编译为目标文件data.o
gcc -c -o data.o data.c
4.将编译data_.c编译为目标文件data_.o
gcc -c -o data_.o data_.c -IC:/mono-3.2.3/include/mono-2.0
5.将data.o和data_.o 合成为一个单一的静态库:data.a
ar rcs data.a data_.o data.o
6.编译test.c和连接data.a,生成 test.exe
gcc -o output\test.exe test.c data.a %GCC_OPT% -lmonosgen-2.0
最后的成果如下

winform 最基本的 lib 有以下几个,添加到lib\mono\gac目录下。

运行试试,没有问题

那么最关心的事情来了。
这个文件打包了mono的.net 运行时,size有多大呢?

压缩一下

相比传统的打包.net 运行时 这应该是一个非常满意的尝试吧,结束!
如果大家觉得有需要,下篇文章我会写如何的配置 打包环境。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?