//Marshal.Copy(bytes, 0, P2request, Marshal.SizeOf(request));
Marshal.StructureToPtr(request, P2request,true);
этот код C# предназначен для связи с оборудованием с помощью C++ dll, поэтому я должен использовать Marshal.StructureToPtr для передачи структуры в указатель, но когда я это сделаю, это вызовет ошибку («Попытка чтения или записи защищенной памяти. Это часто признак того, что другая память повреждена»).
Хотя ошибка устранена, я не могу понять, почему? надеюсь, кто-нибудь сможет помочь!
Как только я добавлю Marshal.Copy() для очистки буферов, ошибка исчезнет. это значит, что только когда я очищаю буфер, Маршал сможет его записать?
// it works
Marshal.Copy(bytes, 0, P2request, Marshal.SizeOf(request));
Marshal.StructureToPtr(request, P2request,true);
И когда я установлю для третьего параметра значение false (то есть Marshal.StructureToPtr(request, P2request,false);
), проблема тоже будет решена.
//it works
//Marshal.Copy(bytes, 0, P2request, Marshal.SizeOf(request));
Marshal.StructureToPtr(request, P2request,false);
потому что ошибка возникает до того, как я использую внешнюю функцию, поэтому я думаю, что DLL можно игнорировать.
Людям, которые неизменно получают это как аудит. Похоже информации мало, но она есть.
Объяснение третьего параметра StructureToPtr
:
true
для вызова метода DestroyStructure(IntPtr, Type) для параметраptr
перед тем, как этот метод скопирует данные. Блок должен содержать действительные данные.
Замечание к методу AllocHGlobal
:
Кроме того, выделенная память не заполняется нулями.
Следовательно, когда вы вызываете метод StructureToPtr
, есть шанс освободить недействительный адрес, что может вызвать исключение.
большое спасибо @shingo, думаю, я разобрался с этим вопросом.
Я пытаюсь добавить функцию DestroyStructure раньше, и компилятор не может определить аргумент типа, возможно, поэтому возникает исключение.
//Marshal.DestroyStructure(P2request)//The type arguments for method 'method' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Marshal.DestroyStructure(P2request, request.GetType());//it works
«код предназначен для связи с оборудованием с помощью C++ dll», что за DLL, покажите определения функций и структур для C++ DLL.