我想使用 c# 互操作从用 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 的函数,它就可以正常工作......
Edit我将返回类型更改为 IntPtr 并使用:
CTMBeginTransactionResult 结构 = (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。枚举在哪里?是下一个字节吗?