【发布时间】:2014-04-28 08:42:39
【问题描述】:
需要帮助将 delphi 记录转换为 C# 结构并将此结构传递给 C dll:
type Transaction = record
pos_id: array[0..9] of char;
ev_type: array[0..4] of char;
amount: array[0..14] of char;
chip_reader_used: boolean;
internal_magstripereader_used: boolean;
track2data: array[0..99] of char;
card_usage_mode: array[0..4] of char;
receipt_directory: array[0..254] of char;
additional_info: array[0..999] of char;
event_number: array[0..9] of char;
original_filingcode: array[0..19] of char;
transaction_reasoncode: array[0..9] of char;
end;
尝试以下但不工作:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public unsafe struct Transaction {
public fixed byte pos_id[10];
public fixed byte ev_type[5];
public fixed byte amount[15];
public bool chip_reader_used;
public bool internal_magstripereader_used;
public fixed byte track2data[100];
public fixed byte card_usage_mode[5];
public fixed byte receipt_directory[255];
public fixed byte additional_info[1000];
public fixed byte event_number[10];
public fixed byte original_filingcode[20];
public fixed byte transaction_reasoncode[10];
};
而C函数是:
void Card_Event(struct)
C#(由 GetProcAddress 加载)
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void Card_Event_Func(ref Transaction transaction);
IntPtr procAddr = GetProcAddress(_hDLL, "Card_Event");
if ( procAddr == IntPtr.Zero )
return false;
Card_Event_Func Card_Event = (Card_Event_Func)Marshal.GetDelegateForFunctionPointer(procAddr, typeof(Card_Event_Func));
【问题讨论】:
-
“不工作”究竟是什么意思?
-
表示dll调用正常通过但什么也不做。更正:c 调用采用指向结构的指针:Card_Event(struct*) Delphi 版本按预期工作。
-
您是否考虑过对齐问题(打包记录、$Axxx 指令)? C# 结构具有 Pack=1 修饰符。在 Delphi 和 C# 中比较 sizeof(record)