C# P/Invoke上的编组:不应';我在拆卸器里没看到吗?
考虑一下这个片段:C# P/Invoke上的编组:不应';我在拆卸器里没看到吗?,c#,.net,pinvoke,C#,.net,Pinvoke,考虑一下这个片段: [DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern char CharLower([MarshalAs(UnmanagedType.AnsiBStr)] string lpsz); static void Main(string[] args) { var a = CharLower("A"); Console.WriteLine(a); } (请注意,这不是realCha
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern char CharLower([MarshalAs(UnmanagedType.AnsiBStr)] string lpsz);
static void Main(string[] args)
{
var a = CharLower("A");
Console.WriteLine(a);
}
(请注意,这不是realCharLower
函数的正确签名,但这不是重点。)
当我用VS调试器反汇编它时,我得到
var a = CharLower("A");
00AB34DA mov ecx,dword ptr ds:[340230Ch]
00AB34E0 call 00AB0C34
00AB34E5 mov dword ptr [ebp-44h],eax
00AB34E8 movzx eax,word ptr [ebp-44h]
00AB34EC mov dword ptr [ebp-40h],eax
然后,当我将签名更改为[marshallas(UnmanagedType.LPWStr)]
时,我得到了类似的结果:
var a = CharLower("A");
00DE34DA mov ecx,dword ptr ds:[37C230Ch]
00DE34E0 call 00DE0C34
00DE34E5 mov dword ptr [ebp-44h],eax
00DE34E8 movzx eax,word ptr [ebp-44h]
00DE34EC mov dword ptr [ebp-40h],eax
唯一的区别似乎是内存位置
编组代码不应该在这里可见吗?被调用的函数不是在
user32.dll
中定义为CharLower
的函数吗?编组将在调用堆栈的下一层进行。我可以按机器代码的顺序进行吗?VS中的调试器控件似乎只跨过C#语句。我相信这是可能的,但这不是我做过的事情。为什么您首先要问这个问题?属性是CLR中的字段封送员处理的内容。非常复杂的代码,它经过了大规模的微优化,你的眼睛将在10秒钟内流血。@CodyGray,或者更具体地说,在CoreCLR中。编组将在调用堆栈的更深处发生。我可以明智地进入机器代码吗?VS中的调试器控件似乎只跨过C#语句。我相信这是可能的,但这不是我做过的事情。为什么您首先要问这个问题?属性是CLR中的字段封送员处理的内容。非常复杂的代码,经过大规模的微优化,你的眼睛将在10秒内流血。@CodyGray,或者更具体地说,在CoreCLR中。