【发布时间】:2012-03-01 08:49:32
【问题描述】:
我知道 CLR 在某些情况下需要进行封送处理,但假设我有:
using System.Runtime.InteropServices;
using System.Security;
[SuppressUnmanagedCodeSecurity]
static class Program
{
[DllImport("kernel32.dll", SetLastError = false)]
static extern int GetVersion();
static void Main()
{
for (; ; )
GetVersion();
}
}
当我用调试器闯入这个程序时,我总是看到:
鉴于不需要进行封送处理(对吗?),有人可以解释一下在这个“托管到本机的转换”中实际发生了什么,为什么有必要?
【问题讨论】:
-
也许调用堆栈中的那一行只是提供信息,让您知道何时过渡
-
@DavidHeffernan:哦.......我想这也有效......但我感觉还有其他事情发生(虽然我很想被证明是错误的!) .
-
@DavidHeffernan:有趣的是,从
kernel32.dll转到mscoree.dll时,它并没有说同样的话……所以这让我怀疑确实发生了一些事情。跨度> -
存在封送处理,因为 CLR 使用
OutAttribute自动将返回值视为普通参数。 -
@RichardSzalay:哦,你完全正确。但我想问题是,为什么在
mscoreei.dll之后没有过渡?
标签: c# .net pinvoke unmanaged managed