나는 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);
가 어떻게 # C에서 ctm_begin_customer_transaction를 호출 않습니다. const char * 잘 문자열, mapps 있지만 다양한 시도 (stackoverflow 및 기타 사이트보고)에도 불구하고 반환 구조를 마샬링 할 실패합니다. CTMBeginTransactionResult 구조 = (CTMBeginTransactionResult) Marshal.PtrToStructure (PTR의 typeof (CTMBeginTransactionResult)) : 내가 편집 이 작품을 좋아 INTPTR 반환하는 기능 ...
를 정의하면 내가 IntPtr입니다 및 사용에 반환 유형을 변경 한 ;
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 \ 0 \ 0 \ B \ \ 는하지만 I는 시도 AccessViolationException
을 던진다 이 시점에서 "b"? "70e3589b-2de0-4d1e-978d-55e22225be95"는 struct의 szTransactionID입니다. Enum은 어디에 있습니까? 다음 바이트입니까?
답장을 보내 주셔서 감사합니다. 덧글은 내 대답을 놓을 수있는 나쁜 곳이므로 질문을 대신 편집했습니다. – Eiver
잠재적 인 메모리 누수 문제를 발견하기위한 +1 – Eiver