簡體   English   中英

在C#中更改結構以匹配新的C定義

[英]Change struct in C# to match new C definition

我正在使用C#+ WPF開發一個程序,用於分析嵌入式系統的固件。 該固件用C語言編寫,並包含許多結構。 在新的固件版本之后,這些結構之一已更改。 我的軟件必須支持所有固件版本。

固件版本1

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MainStruct
{
    public byte Member1;
    public byte Member2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public UInt16[] Member3;
}

固件Ver.2

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MainStruct
{
    public byte Member1;
    public Uint Member2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public UInt16[] Member3;
}

邏輯

public void ShowStruct(MainStruct MyStruct)
{
    ShowData(MyStruct.Member3);
}

該軟件執行的步驟概述:

  1. 存取裝置
  2. 獲取固件版本
  3. 選擇結構

如何保證兼容性?

使兩個版本的結構都實現一個接口。 使您的界面具有每個對象的getter和setter。 確保正確處理鑄造。

interface MainStructInterface()
{
    void setMember1(byte b);
    byte getMember1();
    void setMember2(Uint b); // Cast to byte in the first firmware version struct.
    Uint getMember2();
    // etc
}

另外,請查看此結構布局格式:

    [StructLayout(LayoutKind.Explicit, Pack = 1)]
    public unsafe struct StructMessage
    {
        [FieldOffset(0)] public fixed byte data[13]
        [FieldOffset(0)] public byte Member1;
        [FieldOffset(1)] public Uint Member2;
        [FieldOffset(5)] public fixed UInt16 Member3[4];
    }

使用這種格式,您可以將所有內容加載到字節數組中,然后非常輕松地訪問每個成員。

暫無
暫無

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

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