.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 运行时 这应该是一个非常满意的尝试吧,结束!
 

MONO 如何打包 .NET程序独立运行(winform篇)的更多相关文章

  1. 转 让NET C# 程序独立运行(脱离 .NET Framework运行,绿色运行) 未验证

    但是.net版本众多.而且.NET Framework框架很大.拖着一个大大的.net Framework总是让人很郁闷. 在网上找呀找呀.找到另一个.NET Framework 替代方案.Mono. ...

  2. 将Java项目打包成可以独立运行的Jar包

    因为一直也没怎么用过Java的原因,所以以前本科上课的时候,在控制台下运行Java程序都是仅仅运行单个的没有第三方库依赖的情况下运行的 那种情况特别简单,只要输入Javac 文件名.java等到编译完 ...

  3. [python学习笔记] pyinstaller打包pyqt5程序无法运行

    问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...

  4. [转].NET程序在windows操作系统上独立运行的技术要点

    发现一个不错的网站,转载一篇文章方便查看 转自 http://www.linuxdot.net/bbsfile-3354   ===================================== ...

  5. .net打独立运行环境遇到无法trim遇到的bug

    背景介绍 工作中我用到kotlin写代码,在orm上ktorm是一款非常优秀的操作db的框架,我喜欢用它所以我写了一个插件能够增加我的工作效率,这款idea插件的主体逻辑是.net开发的(没错是跨平台 ...

  6. MonoTouch 二三事(三)mono mkbundle 打包程序的解包支持

    2014.10.06 更新 编写了 IDA Pro 的插件,用来解包和打包 mkbundle程序,请参见 https://github.com/binsys/MKBundleManager 许久以后, ...

  7. hadoop:将WordCount打包成独立运行的jar包

    hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP_HOME/bin/hadoop xxx ...

  8. 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行

    [TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...

  9. winform .net2.0的程序如何运行于.net 4.x

    约束 最近有一个winform项目,要求: (1)程序能够运行在winxp, win7, win8, win10中 (2)安装尽可能简单,尽量不要安装.net framework.即使要安装也要尽可以 ...

随机推荐

  1. Myeclipseforspring 10破解

    破解包和说明下载网址:http://ishare.iask.sina.com.cn/f/33848276.html?all=y

  2. C++中vector 容器的基本操作

    vector是一种简单高效的容器,具有自动内存管理功能.对于大小为n的vector容器,它的元素下标是0~n-1. vector有二个重要方法:     begin(): 返回首元素位置的迭代器.   ...

  3. osgearth earth文件规范-符号参考

    osgearth earth文件规范-符号参考 osgEarth用样式表渲染要素和注记. 本文档列出了可在样式表中使用的所有符号属性.不是每个符号是适用于每种情况:这只是一个主列表. 跳转到符号: • ...

  4. eclipse 设置编辑窗口字体和背景颜色

    最近装了几次系统,公司也换过电脑,所以换了几次eclipse,当然家里用的当然是最新版,公司就只有用几百年前的东西了 进入重点,我的编辑窗口习惯使用灰色的背景,感觉全白的不好看,还伤视力(没有科学依据 ...

  5. iOS 之 CALayer与UIView的区别

    最大区别:CALayer (图层)不会直接渲染到屏幕上. UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它.它本身完全是由CoreAnimation来实现的. 真正的绘图部分,是由一 ...

  6. jQuery动画高级用法(上)——详解animation中的.queue()动画队列插队函数

    决定对animate方面做一些总结,希望能给大家一些启发和帮助 从一个实际应用谈起 今天不谈animate().fadeIn().fadeOut().slideUp().show().hide()诸如 ...

  7. Delphi中点击DBGrid某一行获得其详细数据方法

    http://www.cnblogs.com/leewiki/archive/2011/12/16/2290172.html Delphi中点击DBGrid某一行获得其详细数据方法 前提是用ADOTa ...

  8. css 清除浮动的方法

    /*方法一*/ /*局部清除*/ ;visibility:hidden;display:block;clear:both;} .clr{display:inline-block;} .clr{disp ...

  9. java服务器获取客户端ip

    在写服务端代码时,有时需要对客户端ip做认证,比如限制只有某些ip能访问,或者1个ip1天只能访问几次.最近就碰到个需要限制ip的情况,从网上找了一些服务器获取客户端ip的方法,说的都不太完善,这里整 ...

  10. 如何在Crystal框架项目中内置启动MetaQ服务?

    当Crystal框架项目中需要使用消息机制,而项目规模不大.性能要求不高时,可内置启动MetaQ服务器. 分步指南 项目引入crystal-extend-metaq模块,如下: <depende ...