Я хочу использовать взаимодействие 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);
Как мне вызвать ctm_begin_customer_transaction из c #. 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 из структуры. Где находится Enum? Это следующий байт?