Я маршалинг родной код выигрыша 32 из-за смешения value-type
членов и reference-type
членов в структурах внутри объединений, я преобразовал все мои ссылочные типы в байт и обратился к размеру из них с помощью fielOffset
. Теперь я хочу получить доступ к значению одного из этих членов, и я не знаю, как это сделать. нижеприведенные коды являются образцами.Чтение массива символов из байт в неуправляемой памяти
здесь C++ структура
typedef struct
{
int Port;
char SubsId[FIELD_SIZE_SUBS_ID+1];
char Options[FIELD_SIZE_OPTIONS+1];
} MMTPRcnxReq;
здесь C# эквивалент
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct MMTPRcnxReq
{
[FieldOffset(0)]
public Int32 Port;
[FieldOffset(4)]
public byte SubsId;
[FieldOffset(4 + FIELD_SIZE_SUBS_ID + 1)]
public byte Options;
}
теперь я хочу, чтобы получить доступ к значению Subid, который на самом деле является массив символов и exmaple сравнить его строка в моем управляемом коде, , как показано ниже
if(mMTPRcnxReq.SubsId == "12345") // WRONG
хау Я могу это сделать?
Странный код. Вам вообще не нужно 'FieldOffset', используйте' [MarshalAs (UnmanagedType.ByValArray, SizeConst = FIELD_SIZE_SUBS_ID + 1)] public Byte [] SubsId; ', то же самое для параметров. –
Я смущен вашим вопросом, сначала 'char' имеет более одного байта, а строка имеет не менее 1' char'. 'SubsId' не может быть массивом символов, если он объявлен как' byte'. – Jodrell
@AlexFarber, я не хочу использовать ссылочный тип вообще. – Parid0kht