使用Pinvoke时,我们在基于CLR的程序中使用机器代码dll 我的问题很简单,它是如何工作的? CLR如何运行机器代码?
答案 0 :(得分:2)
CLR对本机函数执行call
指令。只要遵循调用约定,本机函数就不关心它的调用者是什么。
在执行call
指令之前,可能需要在堆栈和寄存器中设置参数。这一点与本机编译程序的实现方式根本不同。
.NET支持对复杂类型进行编组,例如对象引用,StringBuilder
,委托等。这些特殊情况最终会导致指向堆栈的指针(或通过寄存器发送指针)。同样,与本机代码相比,没有任何根本特殊的东西。
答案 1 :(得分:2)
我认为你的印象是.net程序是在虚拟机中执行的。虽然可能会这样做,但.net的众所周知的实现并没有这样实现。
不是使用虚拟机,而是将.net代码编译到目标机器架构。通常这发生在两个阶段。由开发人员执行的主要编译编译为中间语言IL。然后,在执行之前,即时编译器将IL编译为本机机器代码。它是执行的本机机器代码。
从这个角度来看,调用非托管代码没有任何困难。对本机DLL的调用并不特别特别。没有虚拟机可以逃脱。直接调用本机代码。显然,必须对参数进行编组等。但是,从机器的角度来看,本机代码与JIT编译的托管代码几乎没有什么不同。