在P / Invoke上编组:我不应该在反汇编程序中看到它吗?

时间:2016-08-30 14:14:33

标签: 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);
}

(请注意,这不是真实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的函数被调用?

0 个答案:

没有答案