Контекст: Я портирую какой-то старый код 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