類似佈局,加上 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] 宣告。但最終單純用兩個陣列作為「共用體」欄位可編譯,加上 unsigned char Mpi 則編譯或執行皆失敗。反覆嘗試失敗後,聯想到記憶體中共用體實際用最大欄位大小的記憶體空間,嘗試直接定義 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] byte Mac[6],果然解決共用體問題。C++ 傳入參數實際上也是 6 位元組陣列,既然一個陣列搞定,還要共用體幹嘛?於是出現正解:
public struct CON_TABLE_TYPE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Adr; // connection address
// MPI/PB station address (2)
// IP address (192.168.0.1)
// Mac address (08-00-06-01-AA-BB)
public byte AdrType; public byte SlotNr; public byte RackNr;
}
[DllImport("Prodave6.dll")]
public extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen, ref CON_TABLE_TYPE pConTable);
unsigned char * pBuffer有兩種轉換選擇:byte[] 或 StringBuilder,視具體情況而定。例如:
int GetErrorMessage_ex6(int ErrorNr, unsigned long BufLen, unsigned char* pBuffer);
void copy_buffer_ex6(unsigned char* pTargetBuffer, unsigned char* pSourceBuffer, unsigned long Amount);
前者轉 StringBuilder,後者轉 byte[]。
例如 db_read_ex6 中的 unsigned char DatType 實際對應 0x02=BYTE, 0x04=WORD, 0x06=DWord,可轉為:
public enum DatType : byte { BYTE = 0x02, Word = 0x04, DWord = 0x06 }