Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# P/Invoke上的编组:不应';我在拆卸器里没看到吗?_C#_.net_Pinvoke - Fatal编程技术网

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);
}
(请注意,这不是real
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  
然后,当我将签名更改为
[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中。