. NET Windows Проблема вызова API только в 64-битном процессе - PullRequest
1 голос
/ 22 апреля 2020

Контекст: Я портирую какой-то старый код VB. NET с x86 на платформу AnyCPU.

Постановка задачи : В экземпляре класса я заметил вызов функции kernel32 CreatePipe может неожиданно изменить при запуске в качестве 64-битного процесса значение совершенно не связанной переменной логического класса с True на False. Никаких исключений и ничего другого, только то изменение значения, которое я вижу в часах, когда происходит этот вызов 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-битном процессе. Неправильный доступ к памяти, вызывающий изменение значения флага? Почему именно эта переменная? Это связано с неправильной спецификацией длины переменных, которая, возможно, привела к тому, что вызов перезаписал следующие несколько байтов данных (это может быть там, где живет логическая переменная)? Хотя это всего лишь предположение ...

В целом, есть ли какие-либо рекомендации по переносу кода. NET с платформы x86 на AnyCPU, когда есть один или несколько вызовов API Windows

...