предположим, что 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 # пытается его удалить ...
Заранее спасибо, и, надеюсь, мои вопросы не являются расплывчатыми или непонятными.