[英]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);
}
該軟件執行的步驟概述:
如何保證兼容性?
使兩個版本的結構都實現一個接口。 使您的界面具有每個對象的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.