zoukankan      html  css  js  c++  java
  • 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:CsharpMonoTestTestBuildTestBuildWindowsFormsApplication1inDebugWindowsFormsApplication1.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 est.exe test.c data.a %GCC_OPT% -lmonosgen-2.0
     
    最后的成果如下
     
    winform 最基本的 lib 有以下几个,添加到libmonogac目录下。
     
    运行试试,没有问题
     
    那么最关心的事情来了。
    这个文件打包了mono的.net 运行时,size有多大呢?
     
    压缩一下
     
    相比传统的打包.net 运行时 这应该是一个非常满意的尝试吧,结束!
     
    output.rar

    编译后的程序:

    如果大家觉得有需要,下篇文章我会写如何的配置 打包环境。

  • 相关阅读:
    Centos 6.5 Install Mysql 8.0.0
    Django根据现有数据库建立/更新model
    Python之路【第十七篇】:Django【进阶篇 】
    Django之Model操作
    Django之Form组件
    Appium+python自动化获取toast消息(windows版)的方法
    'sudo'不是内部或外部命令,,,,的解决办法
    LookupError: unknown encoding: cp65001解决方案
    进程和线程(5)-分布式进程
    进程和线程(4)-进程 vs. 线程
  • 原文地址:https://www.cnblogs.com/yudongdong/p/6437594.html
Copyright © 2011-2022 走看看