1

背景:我正在将一些旧的 VB.NET 代码从 x86 移植到 AnyCPU 平台。

问题陈述:在一个类实例中,我注意到对kernel32 CreatePipe 函数的调用会意外地改变,当作为 64 位进程运行时,一个完全不相关的布尔类变量的值从TruetoFalse。没有抛出异常,也没有其他任何东西,只是发生调用时我在手表中看到的值变化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?

4

0 回答 0