Как я могу преобразовать это в C # (Marshalling) - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть эти объявления (DLL) и я пытался преобразовать его в C #, чтобы я мог вызывать функции из DLL.

То же самое для struct1 в struct3

typedef struct1  
{  
    int num;  
    char chars[25];  
    short shrt;  
    union  
    {  
         struct4 objstruct4;  
    }  
}  

typedef struct
{        
    Long Length;    
    short Type;    
    union    
    {
       struct1 objStruct1;      
       struct2 objStruct2;      
       struct3 objStruct3;    
    }Data;  
} Msg;

В C #,я преобразовал эти ... то же самое для struct1 в struct3

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct struct1  
{
    [MarshalAs(UnmanagedType.I4)]
    public Int32 num;  

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = size + 1)]
    public string chars;  

    [MarshalAs(UnmanagedType.I2)]
    public short shrt;  

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct struct4
    {                
        [MarshalAs(UnmanagedType.Struct)]
        public ...
        ...
    }

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
protected struct Msg
{
    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.I4)]
    public int Length;

    [FieldOffset(4)]
    [MarshalAs(UnmanagedType.I2)]
    public short Type;

    [FieldOffset(6)]
    [MarshalAs(UnmanagedType.Struct)]
    public Data MsgData;  
}

[StructLayout(LayoutKind.Explicit, Pack = 1, CharSet = CharSet.Ansi)]
public struct Data
{
    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.Struct)]
    public struct1 objStruct1;      

    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.Struct)]
    public struct2 objStruct2;      

    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.Struct)]
    public struct3 objStruct3;    

}

Проблема в том, когда я пытался вызвать функцию из DLL и передал struct MSG как REF, некоторые переменные-членывнутренних структур / объединений (от struct1 до struct3) не имеют значений.Как будто они грохочут в памяти ...

Но когда я удаляю struct1 или struct2 в struct MSG, все переменные-члены внутри оставшихся внутренних структур / объединения были успешно извлечены.

Могу ли я попросить вашего совета, если мое преобразование правильное или я что-то пропустил ... Или есть лучший способ преобразовать это, или у вас есть ответы, почему эта проблема возникает.Я подозреваю, что размер структуры, ANSI или Unicode и расположение переменных, структур.

Пожалуйста, сообщите - спасибо.

sample 2:
////////////////

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct1  
{
    [MarshalAs(UnmanagedType.I4)]
    public Int32 num1;  

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = size + 1)]
    public string chars;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct2 
{
    [MarshalAs(UnmanagedType.I4)]
    public Int32 num2;  
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct3 
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = size + 1)]
    public string chars;

    [MarshalAs(UnmanagedType.I4)]
    public Int32 num3;  
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct4
{
    [MarshalAs(UnmanagedType.I4)]
    public Int32 num4;  

    [MarshalAs(UnmanagedType.Struct)]
    public Data DataMsg;

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct Data
    {
      //[FieldOffSet(0)]
      public struct1 str1;

      //[FieldOffSet(0)]
      public struct2 str2;

      //[FieldOffSet(0)]
      public struct3 str3;
    }
}
////////////////

1 Ответ

2 голосов
/ 07 апреля 2011

Нет очевидной причины, по которой вы выбрали Pack = 1, для большинства компиляторов C по умолчанию установлено значение 8, как и в .NET. MsgData по смещению 6 ненадежно. Используйте sizeof и offsetof () в тестовой программе на C, чтобы узнать, где все находится. Сравните с Marshal.SizeOf и OffsetOf () в тестовой программе на C #. Это не сработает, пока они точно не согласятся.

...