有没有办法动态生成本机x86代码并从.NET执行它?

时间:2019-05-03 22:44:05

标签: c# assembly x86 native jit

我想动态生成本地非托管x86代码,然后从托管.NET超快速地执行它。我知道我可以发出一些IL代码并执行该代码,但我认为喷射将花费太多时间才能从中获得任何速度增益。

我需要超快速代码,我想用内存中的x86操作码生成一个函数,并将固定的指针传递给它的内存块,这样它将在该块上进行一些真正快速的计算。

我只是不确定如何从.net调用本机代码。请记住,这应该在内存中进行,而不是构建dll。速度才是真正重要的。这是基因计算项目的一部分。

2 个答案:

答案 0 :(得分:0)

C语言是“便携式汇编程序”,您可以直接生成x86操作码(用汇编程序编写会更好)。如果将C代码编译为对象,则可以将其作为库链接到.net。

如果您试图动态地(即时)生成可执行代码,则需要分配一个二进制数组,将目标代码压入该数组,然后在内存指向并分配后获取该数组的起始地址指向函数指针并调用它。

但是,防病毒软件专门针对这种行为进行查找,并且很可能将您的代码识别为病毒。

您的处理器还设计为具有“代码”存储段和“数据”存储段。通常,您不能在不引起段错误的情况下动态修改代码段,也不能在不引起段错误的情况下执行数据段。

此外,您的代码只能在SISC处理器(x86)上运行,而不能在RISC处理器上运行。

有很多需要考虑的地方。

过去,我们过去在SISC系统上使用汇编程序来完成此操作。

干杯, 大卫

答案 1 :(得分:0)

简短的答案是,您无法使用C#做到这一点。

您可以使用C ++ / CLI来做到这一点,方法是构建一个混合模式程序集,该程序集以本机代码执行“超快速”计算。这样,您将(大概)不需要“即时”生成可执行代码。

如果由于某种原因您无法对计算函数进行硬编码,那么您将不得不从操作系统获取可执行内存。

在Windows上,您可以使用VirtualAllocVirtualProtect函数。再次,从C#中执行此操作将需要P / Invoke互操作,这很可能会逆转您的速度提升。