Ооооо, чувак!Вы выбрали довольно сложный случай для своего первого безумного опыта.Я рекомендую сначала сделать что-то попроще, а затем перейти к реальным вещам.
Сначала , CharSet=CharSet.Ansi
выглядит подозрительно.Все ваши строки и символы _tuchar
, и я собираю u
там, что означает "Unicode", не так ли?Если это так, вам нужно CharSet=CharSet.Unicode
.
Во-вторых (и это наиболее вероятный виновник), почему поле ErrorMessages
маршалируется как ByValArray
?Вы знаете, что ByVal
здесь означает "по стоимости", не так ли?Как в, не по ссылке.И вы знаете, что маленькая звездочка в C ++ означает «ссылка», не так ли?Так почему же ваше ссылочное поле ErrorMessages
маршалируется как массив значений?В случае, если вы не знаете, массив обычно считается переданным «по значению», когда передается весь его контент, вместо простой передачи ссылки (указателя) в область памяти, где хранится весь этот контент.В определении структуры C ++ вы указываете _tuchar*
, что означает «ссылку (указатель) на некоторую память, содержащую один или несколько _tuchars», тогда как в C # вы указываете [MarshalAs(UnmanagedType.ByValArray, SizeConst=500)]
, что означает, что «здесь должно быть 500 _tuchars,не больше и не меньше ".Видя, что ссылка (указатель) обычно занимает 4 байта (или 8 байтов на 64-битных машинах), а 500 символов юникода занимают 1000 байтов, вы обнаружите очевидное несоответствие прямо здесь. в-четвертых , та же точка относится к полям result
и blocks
.
В-пятых , поле language
полностью противоположно: код C ++ говорит: "здесь 3 _tuchars », в то время как код C # говорит« здесь есть ссылка (указатель) на строку »(если вы не знаете, LPStr
означает« длинный указатель на STRing »)
И, наконец, , после того, как вы исправили все эти проблемы, я рекомендую вам выполнить вашу программу и распечатать результат вызова Marshal.SizeOf( typeof( MyStruct ) )
.Это даст вам точную оценку вашей структуры, по мнению .NET.Перейдите на сторону C ++ и распечатайте sizeof( MyStruct )
.Это даст вам то, что С ++ думает о размере.
Если они получатся разными, посмотрите, что не так.Попробуйте удалить поля одно за другим, пока они не станут одинаковыми.Это даст вам поле (и) виновника.Работайте с ними.
В целом, я предлагаю вам лучше понять, как все работает в первую очередь.Этот случай слишком сложен для начинающего.
Удачи!