cで記述されたdllから関数を呼び出すために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);
C# から ctm_begin_customer_transaction を呼び出す方法を教えてください。const char * は文字列に適切にマップされますが、さまざまな試み (stackoverflow や他のサイトを参照) にもかかわらず、戻り構造をマーシャリングできません。IntPtr を返す関数を定義すると、問題なく動作します...
編集 戻り値の型を IntPtr に変更して使用します。しかし、それは 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 Enum はどこにありますか?次のバイトですか?