C # P / Invoke: указатель на строку как сообщение об ошибке - PullRequest
1 голос
/ 13 сентября 2010

Я пытаюсь использовать llvmc в качестве библиотеки C #, используя P / Invokes (потому что я не могу найти никаких привязок .NET).

Однако у меня проблема.llvmc использует char ** для передачи ошибок.

Примером может быть:

char* error = NULL;
LLVMVerifyModule(PointerToSomeModule, LLVMAbortProcessAction, &error);

Что мне нужно сделать, чтобы разрешить использование этой функции в коде C #?

РЕДАКТИРОВАТЬ: пример, который я нашел , также упоминает этот вызов:

LLVMDisposeMessage(error);

Я только что увидел ответы и подумал, что это может быть важной деталью.

Ответы [ 2 ]

5 голосов
/ 13 сентября 2010

Аргумент char ** неприятен, есть проблема с управлением памятью. Если вы объявите аргумент как «out string», маршаллер P / Invoke попытается освободить указатель. Это вряд ли сработает, для этого требуется, чтобы строка была выделена с помощью CoTaskMemAlloc ().

Единственная другая опция, которую вы должны объявить как "out IntPtr" и выполнить маршалинг строки самостоятельно с помощью Marshal.PtrToStringAnsi (). Это сработает, за исключением непоправимой утечки памяти, если LLVMC действительно ожидает, что вы освободите указатель. Назовите это миллион раз, чтобы убедиться в этом. Есть несколько шансов, что это не произойдет, так как это сообщение об ошибке, оно может вернуть указатель на строковый литерал.

Единственный оставленный вариант - написать оболочку на языке C ++ / CLI, чтобы вы могли освободить указатель.

0 голосов
/ 13 сентября 2010

Взгляните на класс StringBuilder . Или вы можете просто объявить параметр как целочисленный параметр и использовать Marshal.PtrToStringAnsi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...