将C#应用程序编译为本机可执行文件

时间:2013-05-13 17:30:19

标签: c# .net mono native mkbundle

我知道这个问题之前出现了几次,但我找不到简单案例的答案:

是否有免费工具将小型.NET C#应用程序编译为本机可执行文件?

到目前为止我发现的是昂贵的工具,它们删除了.NET框架并将其编译成可执行文件,但在我们的案例中没有必要。安装.NET框架没有问题,我们只想预编译一个C#项目,以便用户出于安全原因无法反编译IL代码。 .NET监听器是不够的,因为我们有敏感的代码部分。

Mono-AOT不是一个选项,因为它需要在目标机器上安装单声道,而不是我不满意的。

Ngen.exe似乎最接近我们需要的,但是我们如何分发输出文件?它似乎也包含IL代码,因为它表示“只要NGen生成的图像在不兼容的环境中运行,.NET框架就会自动恢复使用JIT”。

这种情况是否有实用的工作流程?

EDIT2:我真的很想知道为什么这个问题被关闭了......

解决方案是来自Mono项目的mkbundle:

我找到了一个shell脚本,它将一个带有Mono mkbundle的.NET应用程序编译成一个独立的本机可执行文件,并将其修改为最新版本,截至2013年5月,您可以按如下方式使用该脚本:

https://gist.github.com/tebjan/5581296

1。)安装cygwin并确保选择以下软件包: - gcc-mingw - pkg-config - mingw-zlib1 - mingw-zlib-devel

2.。)安装Mono发行包:“Mono for Windows,Gtk#和XSP”

3。)下载脚本并将其放在您的应用程序旁边并修改它以适应您的环境(仔细阅读文件中的注释)。

4.打开cygwin并导航到应用程序的输出文件夹,其中包含可执行文件和scipt所在的文件夹,例如YourProject / bin中/释放

5.使用以下命令执行脚本:./ mkbundle_cygwin.sh

故障排除:如果捆绑的可执行文件不起作用,请确保原始.NET应用程序在单声道上运行。您可以通过调用mono.exe并将.NET应用程序传递给它或安装XamarinStudio并从那里运行项目来测试(确保将mono设置为运行时)。

2 个答案:

答案 0 :(得分:1)

对于您的特定情况,似乎最简单的方法是将魔术字节放入单独的本机DLL中,并使托管代码使用p / invoke来检索它们。这符合您提到的两个要求:

  • 将魔术数据与使用它的代码分开
  • 将魔术数据保留在.NET程序集之外

答案 1 :(得分:0)

有商业混淆器产生了相当不错的结果,在最大设置下尝试Esiriz .NET Reactor。

当然有人可以最终扭转局面,但我很确定如果你真的需要隐藏自己的东西,那么你可以做的最好的事情。