Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将C应用程序编译为本机可执行文件_C#_.net_Mono_Native_Mkbundle - Fatal编程技术网

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

C# 将C应用程序编译为本机可执行文件,c#,.net,mono,native,mkbundle,C#,.net,Mono,Native,Mkbundle,我知道这个问题以前曾出现过几次,但我无法为我们的简单案例找到答案: 有没有免费的工具可以将小型.NETC应用程序编译成本机可执行文件 到目前为止,我发现了一些昂贵的工具,这些工具可以剥离.NET框架并将其编译成可执行文件,但在我们的例子中,这是不必要的。安装.NET framework没有问题,我们只想预编译一个C项目,这样用户就不能出于安全原因反编译IL代码了。NET obsucator是不够的,因为我们有敏感的代码部分 Mono AOT不是一个选项,因为它需要在目标机器上安装Mono Nge

我知道这个问题以前曾出现过几次,但我无法为我们的简单案例找到答案:

有没有免费的工具可以将小型.NETC应用程序编译成本机可执行文件

到目前为止,我发现了一些昂贵的工具,这些工具可以剥离.NET框架并将其编译成可执行文件,但在我们的例子中,这是不必要的。安装.NET framework没有问题,我们只想预编译一个C项目,这样用户就不能出于安全原因反编译IL代码了。NET obsucator是不够的,因为我们有敏感的代码部分

Mono AOT不是一个选项,因为它需要在目标机器上安装Mono

Ngen.exe似乎是最接近我们需要的,但是我们如何分发输出文件呢?它似乎也包含了IL代码,正如它所说的,只要NGen生成的映像在不兼容的环境中运行,.NET framework就会自动恢复到使用JIT

此场景是否有实用的工作流

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

该解决方案来自Mono项目:

我发现了一个shell脚本,该脚本使用Mono的mkbundle将.NET应用程序编译为独立的本机可执行文件,并将其修改为最新版本。从2013年5月起,您可以按如下方式使用该脚本:

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

二,。安装Mono发行包:Mono for Windows、Gtk和XSP

三,。下载脚本并将其放置在应用程序旁边,然后根据您的环境进行修改仔细阅读文件中的注释

四,。打开cygwin并导航到可执行文件和scipt所在的应用程序的输出文件夹,例如YourProject/bin/Release

五,。使用命令执行脚本:./mkbundle\u cygwin.sh


疑难解答:如果捆绑的可执行文件不工作,请确保原始.NET应用程序在mono上工作。您可以通过调用mono.exe并将您的.NET应用程序传递给它,或者通过安装XamarinStudio并从那里运行您的项目来进行测试。请确保将mono设置为运行时。

有商业混淆器可以产生非常好的结果,请在最大设置下尝试Esiliz.NET Reactor


当然,最终有人会将其反转,但我敢肯定,如果您真的需要隐藏您的东西,这是您能做的最好的事情。

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

将魔法数据与使用它的代码分开 将魔法数据保留在.NET程序集中
是什么让您认为敏感字节不能定位在本机代码中?本机代码可以像托管IL一样进行反编译。您试图防范什么?解决问题的适当方法就是不要在代码中存储敏感信息。它不属于那里,而且从根本上说,只要您的程序能够访问数据,就无法阻止某人访问该数据。适当的解决方案将取决于数据的具体情况。也许你应该有一个web服务来处理这些数据?这可能是实际上可以阻止数据被访问的少数可能的解决方案之一。事实上,任何其他解决方案都可能使其变得更难,但决不是不可能。您应该更详细地解释您认为需要在代码中存储何种信息,以便有人能够提出更好的解决方案-但是,如果您需要在客户端机上存储(例如)用于解密DRM数据的解密密钥,你运气不好-一个足够坚定的攻击者将能够找到密钥,无论代码是多么原生和模糊。你能做的最好的事情就是让它很难找到,但是,一旦有人找到了钥匙,你可能又会倒霉了…一个.net反编译器只是给我代码来计算结果,这就是我想要阻止的事情,比这更糟糕。NET反编译程序可以更改程序以完全删除加密狗检查。在对ngen和其他工具进行了数小时的研究之后,我们不得不重新考虑这一点。但是有了pInvoke/dllimport,人们可以只使用本机.dll中的调用,然后在.NET程序集中再次找到这些调用,并得到结果。。。我认为类似的问题?@thalm:是的,但是本机DLL可以检查调用程序集的签名,确保它是用您的私钥签名的。有趣的想法。。。看起来可行。我将尝试一下……这些函数可能会有所帮助:我发现mkbundle是一个非常好的解决方案,并将其添加到我的问题文本中,由于这个问题已结束,我无法回答自己。