我想使用 c# interop 从用 c 编写的 dll 调用函数。我有头文件。看看这个:
enum CTMBeginTransactionError {
CTM_BEGIN_TRX_SUCCESS = 0,
CTM_BEGIN_TRX_ERROR_ALREADY_IN_PROGRESS,
CTM_BEGIN_TRX_ERROR_NOT_CONNECTED
};
#pragma pack(push)
#pragma pack(1)
struct CTMBeginTransactionResult {
char * szTransactionID;
enum CTMBeginTransactionError error;
};
struct CTMBeginTransactionResult ctm_begin_customer_transaction(const char * szTransactionID);
如何从 c# 调用 ctm_begin_customer_transaction。const char * 很好地映射到字符串,但尽管进行了各种尝试(查看 stackoverflow 和其他站点),但我未能编组返回结构。如果我定义返回 IntPtr 的函数,它可以正常工作......
编辑 我将返回类型更改为 IntPtr 并使用: CTMBeginTransactionResult structure = (CTMBeginTransactionResult)Marshal.PtrToStructure(ptr, typeof(CTMBeginTransactionResult)); 但它会抛出 AccessViolationException
我也试过:
IntPtr ptr = Transactions.ctm_begin_customer_transaction("");
int size = 50;
byte[] byteArray = new byte[size];
Marshal.Copy(ptr, byteArray, 0, size);
string stringData = Encoding.ASCII.GetString(byteArray);
stringData == "70e3589b-2de0-4d1e-978d-55e22225be95\0\"\0\0\a\0\0\b\b?" 此时。 "70e3589b-2de0-4d1e-978d-55e22225be95" 是结构中的 szTransactionID。枚举在哪里?是下一个字节吗?