我想用c#interop從c中編寫的dll調用一個函數。我有頭文件。 看看這個:如何在c#中調用此c函數(解組返回結構)?
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);
如何調用ctm_begin_customer_transaction從C#。 const char *很好地適用於字符串,但儘管有各種嘗試(查看stackoverflow和其他站點),但我無法編組返回結構。如果我定義返回IntPtr的它工作正常功能...
編輯 我改變了返回類型的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 \在這個結構中,「70e3589b-2de0-4d1e-978d-55e22225be95」是來自結構的szTransactionID,其中是Enum?它是下一個字節嗎?
謝謝你的回答。評論是放置我的答案的不好的地方,所以編輯這個問題。 – Eiver 2013-03-08 13:39:04
+1用於發現潛在的內存泄漏問題 – Eiver 2013-03-11 13:38:03