powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Портирование структуры C++ -> C#
4 сообщений из 4, страница 1 из 1
Портирование структуры C++ -> C#
    #38895833
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть у меня на плюсах такая вот штука:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
const PackageDataSize = 7;
typedef AnsiChar TPackageData[PackageDataSize];
typedef
  union {
    struct {
      // Â ñîîòâåòñòâèè ñ ïóíêòîì 11.7
      AnsiChar          COP;      
      TPackageData      Data;   
      union {
        struct {
          Byte          Stable : 1;   
          Byte          Net : 1;        
          Byte          Gross : 1;      
          Byte          Zero: 1;        
          Byte          Reserved1 : 1;  
          Byte          Always1 : 1;    
          Byte          Reserved2 : 1;  
          Byte          Always0 : 1;   
        } LStruct;
        Byte    L;                      
      };
    } Struct;
    AnsiChar    RawData[];
  } TPackage_TenzoM_Ver643;



Мне надо её перевести в шарп. У меня получилось примерно следующее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    char[] TPackageData = new char[7];
        struct TPackage_TenzoM_Ver643
        {
            public TPackage_TenzoM_Ver643(string AInput)
            {
                COP = AInput[0];
                Data = AInput.ToCharArray(1, 7);
                LStruct = new BitArray(AInput[8]);
            }
            public char COP;
            public TPackageData Data;
            public BitArray LStruct;
            public bool Stable { get { return LStruct[0]; } }
            public bool Net { get { return LStruct[1]; } }
            public bool Gross { get { return LStruct[2]; } }
            public bool Zero { get { return LStruct[3]; } }
            public bool Reserved1 { get { return LStruct[4]; } }
            public bool Always1 { get { return LStruct[5]; } }
            public bool Reserved2 { get { return LStruct[6]; } }
            public bool Always0 { get { return LStruct[7]; } }
        }


Всё бы было хорошо, но при попытке получить размер структуры (int size = Marshal.SizeOf(t);) я получаю ошибку:
"Невозможно упаковать тип "Tester.Form1+TPackage_TenzoM_Ver643" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл."

По структуре размер у меня должен быть 9.
COP - 1 байт
DATA - массив из 7 байт
LStruct - 1 байт

Как мне исправить это дело? Я пытался задавать [StructLayout(LayoutKind.Sequential)], т.е.:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
        char[] TPackageData = new char[7];
        [StructLayout(LayoutKind.Explicit, Pack = 1)]
        struct TPackage_TenzoM_Ver643
        {
            public TPackage_TenzoM_Ver643(string AInput)
            {
                COP = AInput[0];
                Data = AInput.ToCharArray(1, 7);
                LStruct = new BitArray(AInput[8]);
            }
            [FieldOffset(0)]
            public char COP;
            [FieldOffset(1)]
            public TPackageData Data;
            [FieldOffset(8)]
            public BitArray LStruct;
            public bool Stable { get { return LStruct[0]; } }
            public bool Net { get { return LStruct[1]; } }
            public bool Gross { get { return LStruct[2]; } }
            public bool Zero { get { return LStruct[3]; } }
            public bool Reserved1 { get { return LStruct[4]; } }
            public bool Always1 { get { return LStruct[5]; } }
            public bool Reserved2 { get { return LStruct[6]; } }
            public bool Always0 { get { return LStruct[7]; } }
        }



Тогда при самом старте приложения я получаю:
Не удалось загрузить тип "TPackage_TenzoM_Ver643" из сборки "Tester, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", так как он содержит поле объекта со смещением 1, которое неверно выровнено или перекрыто полем, не представляющим объект.

Помогите, пожалуйста, выровнять/настроить/сделать/сколотить/нуиличтотамещё эту структуру. На выходе мне нужен размер в 9 байт.
...
Рейтинг: 0 / 0
Портирование структуры C++ -> C#
    #38898739
Алексей Ку., тип char занимает 2 байта, а значит поле COP будет перекрывать поле Data. Попробуй указать:
Код: c#
1.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
...
Рейтинг: 0 / 0
Портирование структуры C++ -> C#
    #38901534
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Витер,

Не помогло. Получаю ошибку

"Невозможно упаковать тип "Tester.Form1+TPackage_TenzoM_Ver643" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл."

при попытке получить раззмер структуры.
...
Рейтинг: 0 / 0
Портирование структуры C++ -> C#
    #38901602
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратил внимание - так там содержатся классы, т. е. управляемые указатели BitArray и, похоже, char[]. Замените на bool*, char* (или byte*) или IntPtr, но классов быть не должно, если используется marshaling в неуправляемую память.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Портирование структуры C++ -> C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]