C#(MSIL)转换为原生X86代码?

时间:2012-10-18 18:01:11

标签: c# assembly compilation x86 cil

我首先想说的是我的目标是将MSIL转换为本机X86代码。我的程序集仍然需要安装.net框架,我很好。 NGEN不是我想要的,因为你仍然需要原装配件。

我遇到了ilasm,而我想知道的是这就是我想要的,这会产生纯粹的汇编代码吗?

我已经看过其他项目,比如mono(它不支持我的应用程序使用的一些关键功能)和.net链接器,但它们只是简单地用.net框架制作一个EXE,这不是我想要的

到目前为止,任何研究都已提出......你做不到。我真的不确定为什么JIT在加载MSIL程序集时会这样做。我有自己的理由想要这个,所以我想我的问题归结为此。

  1. 我发布的链接是否有用?

  2. 有没有可以将MSIL转换为x86程序集的东西?

3 个答案:

答案 0 :(得分:3)

有各种第三方代码保护软件包可以通过对IL进行加密并使用特殊的引导加载程序对其进行打包来隐藏IL,该引导加载程序仅在运行时解包。如果您担心代码的反汇编,这可能是一个选项,尽管大多数这些第三方软件包也已经破解(遗憾的是,有些不可避免。)简单的混淆最终可能同样有效,假设这是您的基本目标

与“预先评估”IL相关的主要挑战之一是您最终在本机代码中包含固定地址引用。当加载本机代码以在CLR下执行时,这些又需要“重新基础”。这意味着您需要的不仅仅是编译的逻辑;您还需要在加载代码时重新定义固定引用所需的所有引用上下文信息。它不仅仅是缓存代码。

答案 1 :(得分:2)

与大多数事情一样,第一个问题应该是为什么而不是如何。我假设你有一个特定的目标,如果你想自己生成本机代码(同样,为什么x86?为什么不是x64呢?)。这是JIT编译器的工作 - 仅在需要时在特定平台上编译优化指令集,并在以后执行。

我可以推荐尝试理解CLR如何工作以及JIT如何工作的最佳来源是SSCLI - 基于ECMA-335规范的CLR实现。

答案 2 :(得分:0)

您是否考虑过不使用C#?鉴于C#编译器的输出是MSIL,如果不是你想要的话,在不同的平台上开发是有意义的。

或者,听起来NGEN会执行您想要的操作,它只是不处理将整个事物放入可执行文件中。您可以分析生成的NGEN图像,以确定需要完成哪些操作(请注意,根据文档,NGENed图像是PE文件)

Here is a link on NGEN包含有关图像存储位置的信息:C:\windows\assembly\NativeImages_CLR_Bit例如C:\windows\assembly\NativeImages_v2.0.50727_86。请注意,.NET 3.0和3.5都是2.0的一部分。