背景:我正在将一些旧的 VB.NET 代码从 x86 移植到 AnyCPU 平台。
问题陈述:在一个类实例中,我注意到对kernel32 CreatePipe 函数的调用会意外地改变,当作为 64 位进程运行时,一个完全不相关的布尔类变量的值从True
toFalse
。没有抛出异常,也没有其他任何东西,只是发生调用时我在手表中看到的值变化CreatePipe
。
我为解决此问题所做的工作:基于 pinvoke 网站 ( https://www.pinvoke.net/default.aspx/kernel32.createpipe ),然后根据下面的评论之一,我将CreatePipe
我班级中的签名从:
Private Declare Function CreatePipe Lib "kernel32" (ByRef phReadPipe As Integer,
ByRef phWritePipe As Integer,
ByRef lpPipeAttributes As SECURITY_ATTRIBUTES,
ByVal nSize As Integer) As Integer
至:
Private Declare Function CreatePipe Lib "kernel32" (ByRef phReadPipe As IntPtr,
ByRef phWritePipe As IntPtr,
ByRef lpPipeAttributes As SECURITY_ATTRIBUTES,
ByVal nSize As Integer) As Integer
它现在可以工作了,我的意思是,布尔值不再意外更改,其余代码按预期运行。
问题:不过,我对此并不十分满意,直到我知道是什么导致了 64 位进程中的这种行为。错误的内存访问导致标志值改变?为什么特别是这个变量?是否由于变量的长度指定不正确,可能导致调用覆盖接下来的几个字节数据(这可能是布尔变量所在的位置)?虽然这只是猜测...
更一般地说,当对 Windows API 进行一次或多次调用时,是否有任何指导方针将 .NET 代码从 x86 平台移植到 AnyCPU?