请考虑以下代码段:
[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);
}
(请注意,这不是真实CharLower
函数的正确签名,但这不是重点。)
当我使用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
当我将签名更改为[MarshalAs(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
唯一的区别似乎是记忆位置。
编组代码不应该在这里可见吗?在CharLower
中是否被称为user32.dll
的函数被调用?