я следующая функция в C++ DLLC# DllImport с C++ функции булева не возвращает правильно
extern "C" __declspec(dllexport) bool Exist(const char* name)
{
//if (g_Queues.find(name) != g_Queues.end())
// return true;
//else
// return false;
return false;
}
Внутри мой C# класса У меня есть следующий:
[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]
public static extern bool Exist(string name);
Тем не менее, всякий раз, когда я называю функция ВСЕГДА возвращает true, даже когда я прокомментировал свою маленькую функцию и сделал ее возвратом false. Я чувствую, что что-то не так с моим соглашением о вызове или с какой-либо другой проблемой с P/Invoking моей DLL, вероятно, соответствует строке и const char *, но пока я совершенно не знаю. Что я делаю не так? Почему он возвращает true вместо false?
EDIT: Я понял, что это не имеет ничего общего с константным полукокса * или струны, потому что проблема не устраняется с пустой функцией. Я попытался изменить соглашение о вызовах между Cdecl и StdCall и не работает правильно. Мне также удалось отладить мою DLL, и она называется правильно и действительно возвращает false, но как только она возвращается на C#, это как-то правда. Изменение CharSet также не повлияло. Я убедился, что каждый раз предоставлял свою программу C# с последней и правильной версией моей DLL, так что это тоже не проблема. Опять же, я совершенно не знаю, почему результат верен, когда я фактически возвращаю ложь.
EDIT2: SOReader предоставил мне с предложением, которое фиксирует еще один важный вопрос, см мой комментарий. К сожалению, это не устраняет проблему возврата.
EDIT3: я пришел к выводу, что изменение типа возвращаемого Exist (BOOL) в (Int) вдруг делает возвращает правильное число (истина = 1, ложь = 0). Это означало бы, что может возникнуть проблема между bool C++ и bool C#. Я могу продолжать использовать int как bool, но это все равно не объяснит исходную проблему. Может, кто-то еще может просветить меня на этом? Возможно, это связано с тем фактом, что я использую x64 (хотя оба объекта скомпилированы как x86)
Первое, что нужно проверить, что функция на самом деле 'cdecl'. Если ваш make-файл передает компилятору 'Gz' или' Gr', то функция выше не 'cdecl'. Добавьте '__cdecl' в свой C-код или включите помощник Managed Debugging Assistant' pInvokeStackImbalance'. –
Я не думаю, что это будет ссылка, если указаны/Gr или/Gz. Хороший вопрос об управляемом помощнике отладки. –
Я протестировал его, и __fastcall не будет связываться с/clr. Но ссылки __stdcall (/ Gz), но тогда точка входа Exist не встречается во время выполнения, поскольку сигнатура функции отличается. –