使用Mono-Runtime-Bundle制作安装包让C桌面应用程序脱离net-fram_第1页
使用Mono-Runtime-Bundle制作安装包让C桌面应用程序脱离net-fram_第2页
使用Mono-Runtime-Bundle制作安装包让C桌面应用程序脱离net-fram_第3页
使用Mono-Runtime-Bundle制作安装包让C桌面应用程序脱离net-fram_第4页
使用Mono-Runtime-Bundle制作安装包让C桌面应用程序脱离net-fram_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net fram. 使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework作者:BAsil | 出处:博客园 | 2011/11/29 16:36:28 | 阅读73次 之前有一个C#版本和ios版本(支持下载学生名单,点名等更多功能,该版本未上app store)的教辅助手帮助学校老师提交成绩到教务系统(浙大正方web版),一直打算用mfc写一个vc+版本的可以方便的在未安装net framework的电脑上使用,前几天看到一篇文章再谈为什么要使用MONO ,既然Unity3D游戏(mono内核)可以单独打包脱离net framework,那我的教辅助手一定可以。可是在网上找了一下,中文资料很少,没有讨论具体技术细节的文章( 让C#程序独立运行(脱离 .NET Framework运行,绿色运行) 是我在移植完成后写教程的时候看到的文章,我的思路和他不太一样,我使用了mkbundle)。教辅助手虽然功能比较简单,但是比hello world还是有技术含量的。我在测试打包的时候使用hello world没有问题,能够脱离net framework正常显示,但如果更复杂的功能和代码以及引入第三方类库的话,到底有没有问题,我心里没底。 实际在我移植的过程中确实碰到很多问题,这个是简单的测试hello world移植所解决不了的。因此我在解决问题后,写下此文记录一下。先说一下教辅助手的功能(由于工作原因无法放出该程序代码),简单点说就是要导入excel成绩表并直接提交到教务系统的页面中,为清楚列表如下1 导入excel成绩表2 提交至web教务系统3 可视界面操作使用的相应技术1 使用System.Data.Oledb访问excel并将取得内容放入System.Data.DataSet2 使用System.Net.HttpWebRequest模拟教务系统登录(该系统使用cookieless方式,所以需要先访问一次得到url中生成的sessionid),然后填入课程相关信息,模拟post提交,使用System.Text.RegularExpressions的正则表达式得到所有学生列表,并根据DataSet内容产生新的Post信息,再次利用post方式提交到教务系统中。3 使用Winform窗口形式相关软件window7 professional 64bitCygwinnet 2.0/3.5/4.0 frameworkmono 2.10.6 gtk 2.12MonoDevelop 2.8.2下面说一下我的具体过程1 首先使用Mono Migration Analyzer(MoMA) 检查已有代码是否可以移植到mono上。我的代码检查通过,但在后继过程发现访问excel功能报错,原因后面会说 。个人感觉MoMA不是很靠谱。2 使用mono编译教辅助手源码。 这里我使用了MonoDeveloper工具,当然也可以使用类似csc.exe的mcs.exe命令行编译方式。不过由于MonoDevelop没有winform的设计器,而且winform是Win32技术,兼容性在Linux下不是很好, mono建议使用GTK#这种第三方的Form技术来做UI,我这里为了使用MonoDeveloper把winform的代码用gtk重写了,用了一个小时吧,代码分层比较好,比较容易剥离。当然如果你习惯csc.exe的命令行方式,而且你的移植后的程序只在window下面运行,那你可以使用mcs.exe并且不需要gtk重写(未尝试此种方式,感觉应该可行,如果哪位朋友有过相关经验,请告知)。使用MonoDevelop要求安装mono和gtk,这里要特别注意的是MonoDevelop可以选择使用net framework还是mono进行编译,开始我没有注意我在MonoDevelop下使用net framework编译运行成功,打包后在mono下运行总是出问题,而且出错信息始终为空,浪费了大量时间。3 在MonoDevelop下选择mono,编译成功后运行失败,报libgda错误,这里解释下问题出现的原因mono下的ole db应该是封装了libgda,而且mono oledb 支持Sql Server,Oralcle,MySql,SqlLite,不支持Excel;至于为什么不支持Excel,很简单Excel实际上是通过COM访问的(这个是微软的,*nix下不支持)。解决的办法就是不用ole db,于是换用CodePlex上的ExcelDataReader,支持mono,ok。4 MonoDevelop运行时正常而打包后运行时System.Net.HttpWebRequest出错。在运行的时候发现HttpWebRequest无法正常工作,甚至简单的HttpWebRequest.Create(开始怀疑过是cookie container以及url路径问题,均排除,痛苦过程不表)。解决的办法是将machine.config文件一并打包。参见Issue with embedding machine.config 实际上我们可以从machine.config发现相关HttpWebRequest的配置信息,该文件路径:mono安装目录etcmonomono版本号machine.config。5 mkbundle打包。 实际上4和5可以一并说,4中描述的问题导致我频繁的测试mkbundle,尝试加载不同的dll。一度怀疑是打包时dll未正确包含所致,将所需的所有类库lib(system.web.dll、.dll、gac目录等)一并拷贝到运行目录下,仍报错且无任何错误提示,抓狂。这里犯了低级错误检讨一下,mono官网提到mkbundle是一种static linker方式,会将所用到的dll连同应用程序一并embed到一个exe文件中,实际上mkbundle后不再需要类库的dll。mono的mkbundle使用Unix-like toolchain,所以要在window下使用mkbundle需要安装cygwin(同样痛苦的过程),选择gcc-mingw, mingw-zlib, pkg-config,zlib(注意不要选gcc全部安装,网上说有问题我试过也是如此,完全卸掉gcc只选择gcc-mingw), 然后配置cygwin的/.bashrc文件中配置export PATH=$PATH:/cygdrive/c/Mono-2.6.1/bin export PKG_CONFIG_PATH=/cygdrive/c/Mono-2.10.6/lib/pkgconfig这里参考Can not compile simple C# application with mkbundle 非常详细结合我的实际使用说明一下:无法单独使用mkbundle o -deps 的方式使用mono runtime, 因为mkbundle有一个bug,详见 New: Mkbundle Fails Due To Missing Reference To G_utf16_to_utf8 (2.8.0, Windows XP) 如果直接使用会报temp.c: In function main: temp.c:170: warning: implicit declaration of function g_utf16_to_utf8 temp.c:170: warning: assignment makes pointer from integer without a cast temp.c:185: warning: assignment makes pointer from integer without a cast /tmp/ccgvpEs0.o: In function main: /cygdrive/d/paco/jpegp4d-deploy/temp.c:170: undefined reference to _g_utf16_to_ utf8 /cygdrive/d/paco/jpegp4d-deploy/temp.c:185: undefined reference to _g_utf16_to_ utf8 collect2: ld returned 1 exit status Fail因此采用mkbundle -c和gcc -mno-cygwin的结合的方式以下引自Can not compile simple C# application with mkbundle ,感谢Lavir the Whiolet执行: mkbundle -c -o host.c -oo bundle.o -deps YourAssembly.exe <additional arguments>. 可选-z进行压缩. 完成后得到host.c和bundle.o文件.在host.c文件中移除_WIN32。增加#undef _WIN32如下:#ifdef _WIN32#include <windows.h>#endif得到:#ifdef _WIN32#include <windows.h>#endif#undef _WIN32执行: gcc -mno-cygwin -o ResultantBundle.exe -Wall host.cpkg-config -cflags -libs mono-2|dos2unix bundle.o <additional arguments>. 如果你mkbundle 加了-z参数, 你必须在这步增加 lz我的补充 (1) 执行mkbundle是需要embed machine.config的话 增加machine.config C:Mono-2.10.6etcmono4.0machine.config,参考mono project bundles (2) 如果引入第三方dll的话(比如我使用了第三方ExcelDataReader的excel.dll), 应该加到mkbundle 的<additional arguments>位置,参考Embedding a JavaScript interpreter with Mono以我的mkbundle为例 mkbundle c o host.c oo bundle.o deps myProgram.exe Excel.dll -machine-config C:Mono-2.10.6etcmono4.0machine.config6 发布 生成的exe文件已经embed mono runtime了,我的应用程序原来32k,使用-z压缩生成后是5MB,有点大不过可以接受。但要脱离net framework在window上执行,还需要调用几个文件,罗列如下(针对mono4.0,我一个个找的,是不是可以做个工具自动查找依赖?)freetype6.dll glibsharpglue-2.dll gtksharpglue-2.dll intl.dll libatk-1.0-0.dll libcairo-2.dll libexpat-1.dll libfontconfig-1.dll libgdk_pixbuf-2.0-0.dll libgdk-win32-2.0-0.dll libgio-2.0-0.dll libglib-2.0-0.dll libgmodule-2.0-0.dll libgobject-2.0-0.dll libgthread-2.0-0.dll libgtk-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论