我可以在这里看到一个CIL指令列表:
据我理解,CIL是在CLR中运行的。但是,我不知道如何使用这些指令来发出http请求(这在CLR中显然是可能的)。
这些代码似乎都不是关于获取外部信息的。
我遗漏了什么?
发布于 2017-12-05 00:02:36
它也没有创建文件的说明。您有必要观察到,使用简单的CIL,有些任务根本无法完成。打开套接字、写入磁盘、在屏幕上绘图等任务既不能由单个CIL指令完成,也不能完全分解成这些指令。
x86汇编代码没有使用PC扬声器播放声音的指令,但显然可以使用它来完成(不是一个完整的示例):
mov al, 0x36
out 0x43, al
mov ax, 11931
out 0x40, al
mov al, ah
out 0x40, al在这里,可以使用out将值写入特定于CPU的端口.这是一种与“外部世界”沟通的方式。在这种情况下,CPU尽可能地运行和解释代码,并且它仅仅理解端口号意味着什么。它可能与串口通信,或者只是在某个地方改变一些电压,但此时,我们满足了硬件,所以这里没有“指令”,只有电。
CIL没有out操作码,因为这将是非常不安全和不可验证的。相反(这可能是您所要求的),它为方法提供了代码实现属性,用于指定在何处查找特定方法的实现。
ImplAttr ::=…本机运行时 这些属性是相互排斥的;它们指定该方法包含的代码类型。 指定方法主体由模具代码组成。除非该方法声明为抽象,否则如果使用,则应提供该方法的主体。 本机指定方法是使用本机代码实现的,该代码绑定到生成该方法的特定处理器。本机方法不应该有主体,而应该引用声明主体的本机方法。通常,CLI的PInvoke功能用于引用本机方法。 运行时指定该方法的实现由运行时自动提供,并主要用于委托方法。(ECMA-335)
标记为cil的方法的主体应由CIL操作码组成,native应指示主体位于某个位置的本机指令中,而runtime将执行方法的任务留给运行时执行。与往常一样,call操作码用于调用这些方法。
这种方法的一个例子:
.method assembly hidebysig static pinvokeimpl("kernel32.dll" autochar lasterr winapi bestfit:off)
bool DeleteFile(string path) cil managed preservesig
{
}由于某些原因,依ECMA-335标准,ildasm显示与pinvokeimpl直接冲突的pinvokeimpl.它应该是native unmanaged,我不知道为什么ildasm会显示这一点。
调用外部方法的机制是P/Invoke、QCall和FCall。有关它们的良好信息可以在这里中找到。这是CIL代码与系统或运行时交互的唯一合法方法。
发布于 2017-12-05 00:10:44
我遗漏了什么?
你的逻辑链是这样的:
然后,您注意到结论是错误的,并正确地注意到,逻辑链中的一个步骤一定是错误的。
第一个是错的。不需要一个方法由大量CIL实现,然后跳转到本机代码中。特别地,使用C#修饰符标记的extern方法是通过将控件传递给声明中提到的(可能是非托管代码) DLL来实现的。因此,可以从运行在CLR下的程序中调用用其他语言编写的代码,这些代码可以在CLR管理之外执行。
https://stackoverflow.com/questions/47361958
复制相似问题