簡體   English   中英

如何將其轉換為c#(編組)

[英]How do I convert this to c# (Marshalling)

我有這些聲明(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調用函數並將結構MSG作為REF傳遞時,內部結構/聯合(struct1到struct3)的一些成員變量沒有值。 就像它們在記憶中隆隆一樣......

但是當我在struct MSG中刪除struct1或struct2時,成功檢索了剩余內部結構/聯合內的所有成員變量。

如果我的轉換是正確的,或者我錯過了什么,我可以問你的建議嗎?或者有更好的方法來轉換這個或你有答案為什么會出現這個問題。 我懷疑的一件事是結構的大小,ANSI或Unicode,以及變量,結構的排列。

請指教 - 謝謝。

樣本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;
    }
}
////////////////

沒有明顯的理由為什么你選擇Pack = 1,大多數C編譯器的默認值是8,就像.NET一樣。 偏移6處的MsgData是不確定的。 在測試C程序中使用sizeof和offsetof()來找出所有內容的位置。 在測試C#程序中與Marshal.SizeOf和OffsetOf()進行比較。 在他們完全同意之前,這是行不通的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM