Platform Invoke, bool и string

предположим, что dll содержит следующие функции

extern "C" __declspec(dllexport) void f(bool x)
{
   //do something
}
extern "C" __declspec(dllexport) const char* g()
{
   //do something else
}

Мой первый наивный подход к использованию этих функций из C # был следующим:

[DllImport("MyDll.dll")]
internal static extern void f(bool x);
[DllImport("MyDll.dll")]
internal static extern string g();

Первым сюрпризом было то, что C ++ bool не конвертируется в C # bool ( странное поведение во время выполнения, но без сбоев). Поэтому мне пришлось изменить bool на байтовое и преобразовать из одного в другое вручную. Итак, первый вопрос: есть ли лучший способ упорядочить bool (обратите внимание, что это bool, а не BOOL)

Второй сюрприз заключался в том, что необработанная строка, возвращаемая функцией dll, принадлежала строке C #, а не копировалась, как я и ожидал, и в конечном итоге код C # освобождает память, возвращаемую dll. Я обнаружил это, потому что программа вылетела из строя, но затем я изменил тип возвращаемого значения на sbyte * и вручную инициализировал строку этим указателем, который уже копирует. Итак, второй вопрос: 2.1: Есть ли лучший способ предотвратить владение указателем упорядоченной строкой. 2.2: Что за фигня ?! Почему C # это делает? Я имею в виду, очевидный случай, когда функция dll возвращает литерал, а C # пытается его удалить ...

Заранее спасибо, и, надеюсь, мои вопросы не являются расплывчатыми или непонятными.

5
задан Armen Tsirunyan 10 October 2010 в 20:45
поделиться