c#编程指南(十四) 平台调用P-INVOKE完全掌握, 反汇编细解结构体作为返回值
2010-09-30 22:46:03 来源:WEB开发网核心提示: 总结一下,这个结构体作为返回值,c#编程指南(十四) 平台调用P-INVOKE完全掌握, 反汇编细解结构体作为返回值(2),主要依赖于编译器对于超过8字节的返回值的编译处理,第一:不建议使用结构体作为返回值,正常的P-INVOKE,不用修改,因为这太依赖编译器了,第二:如果没法改变
总结一下,这个结构体作为返回值,主要依赖于编译器对于超过8字节的返回值的编译处理。
第一:不建议使用结构体作为返回值,因为这太依赖编译器了。
第二:如果没法改变,就用如下的方法判断:
//if (Marshal.SizeOf(typeof(X)) > 8)
//{
// 返回值作为输出参数。
//}
//else
//{
// 返回值正常返回。
//}
第三:<=8字节,正常的P-INVOKE,不用修改。
第四:>8字节,把返回值作为从左向右的第一个输入输出参数:下面是简单的示例
Test GetTest(); ====> IntPtr GetTest(IntPtr lptest);
Test GetTest(int i) ======> IntPtr GetTest(IntPtr lptest, int i);
最后:C#调用Test3 _stdcall GetTest3()为什么:
[DllImport("TestDll")]
public static extern IntPtr GetTest3(IntPtr lptest);
[DllImport("TestDll",EntryPoint="GetTest3")]
public static extern void Test3Extra(IntPtr p);
返回值不同却都可以调用?嘿嘿!!
更多精彩
赞助商链接