使用MONO让.NET程序脱离.NET Framework运行是个不错的方法,网上已有很多介绍。但是MONO运行.NET程序也有让人郁闷的地方,比如你只能使用“mono 你的NET程序名.exe”这样的命令运行你的.NET程序(当然,你也可以用C++写个程序来调用。),虽然也不复杂,但是程序运行时MONO黑乎乎的 命令行窗口实在碍眼。
前些日子看了下MONO官方Embedding Mono介绍,于是动手写了个,用起来爽多了,看下面C++代码:
#include "stdafx.h"
#include <glib/glib.h>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/environment.h>
#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" )
int main(int argc, char* argv[])
{
int retval;
char *file;
file = ".//demo.exe"; // .NET程序路径
//argv[0] = file;
mono_set_dirs(".//lib", NULL);
MonoDomain *domain;
MonoAssembly *assembly;
domain = mono_jit_init (file);
assembly = mono_domain_assembly_open (domain, file);
if (!assembly) exit (2);
mono_jit_exec (domain, assembly, argc, argv);
retval = mono_environment_exitcode_get ();
mono_jit_cleanup (domain);
return retval;
}
#include <glib/glib.h>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/environment.h>
#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" )
int main(int argc, char* argv[])
{
int retval;
char *file;
file = ".//demo.exe"; // .NET程序路径
//argv[0] = file;
mono_set_dirs(".//lib", NULL);
MonoDomain *domain;
MonoAssembly *assembly;
domain = mono_jit_init (file);
assembly = mono_domain_assembly_open (domain, file);
if (!assembly) exit (2);
mono_jit_exec (domain, assembly, argc, argv);
retval = mono_environment_exitcode_get ();
mono_jit_cleanup (domain);
return retval;
}
哎,不会写文章,直接上源码下载地址:http://www.xun6.com/file/0dcf46622/EmbeddingMono.zip.html
压缩包中包含精简过的MONO框架(在Release目录中)仅包含demo所需的组件,所以不适合你的程序,你可以自行下载MONO框架进行精简,这方面网上已有很多文章,我就不再罗嗦了。