首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CIL发出网络/ http请求?

如何使用CIL发出网络/ http请求?
EN

Stack Overflow用户
提问于 2017-11-18 02:47:14
回答 2查看 190关注 0票数 0

我可以在这里看到一个CIL指令列表:

使用说明

据我理解,CIL是在CLR中运行的。但是,我不知道如何使用这些指令来发出http请求(这在CLR中显然是可能的)。

这些代码似乎都不是关于获取外部信息的。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-05 00:02:36

它也没有创建文件的说明。您有必要观察到,使用简单的CIL,有些任务根本无法完成。打开套接字、写入磁盘、在屏幕上绘图等任务既不能由单个CIL指令完成,也不能完全分解成这些指令。

x86汇编代码没有使用PC扬声器播放声音的指令,但显然可以使用它来完成(不是一个完整的示例):

代码语言:javascript
复制
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操作码用于调用这些方法。

这种方法的一个例子:

代码语言:javascript
复制
.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代码与系统或运行时交互的唯一合法方法。

票数 3
EN

Stack Overflow用户

发布于 2017-12-05 00:10:44

我遗漏了什么?

你的逻辑链是这样的:

  • 所有类型的CLR方法都是用CIL指令序列实现的。
  • CIL指令只能执行某些任务。
  • 有些任务需要在CIL中找不到的指令组合。
  • 因此,在CLR方法中某些任务是不可能的。

然后,您注意到结论是错误的,并正确地注意到,逻辑链中的一个步骤一定是错误的。

第一个是错的。不需要一个方法由大量CIL实现,然后跳转到本机代码中。特别地,使用C#修饰符标记的extern方法是通过将控件传递给声明中提到的(可能是非托管代码) DLL来实现的。因此,可以从运行在CLR下的程序中调用用其他语言编写的代码,这些代码可以在CLR管理之外执行。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47361958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档