У меня есть следующая функция в C ++ DLL
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?
РЕДАКТИРОВАТЬ: Я понял, что это не имеет ничего общего с const char * или строкой, потому что проблема сохраняетсяс пустой функцией.Я попытался изменить соглашение о вызовах между Cdecl и StdCall, и ни один из них не работает правильно.Мне также удалось отладить мою DLL, и она вызывается правильно и действительно возвращает false, но однажды вернувшись в C #, это как-то так.Изменение CharSet также не имело никакого эффекта.Я позаботился о том, чтобы каждый раз поставлял своей программе на C # последнюю и правильную версию своей DLL, так что это не должно быть проблемой.Опять же, я совершенно не понимаю, почему результат верен, когда я на самом деле возвращаю ложь.
EDIT2: SOReader предоставил мне предложение, которое исправляет другоеважный вопрос, см. мой комментарий.К сожалению, это не решает проблему возврата.
EDIT3: Я пришел к выводу, что изменение типа возврата Exist (bool) на (int) внезапно делает еговерните правильное число (true = 1, false = 0).Это означало бы, что может быть проблема между bool в C ++ и bool в C #.Я могу продолжать использовать int как bool, но это все равно не объясняет исходную проблему.Может быть, кто-то еще может просветить меня об этом?Возможно, это связано с тем, что я использую x64 (хотя оба объекта скомпилированы как x86)