Ho la seguente funzione in una DLL C++funzione booleana C# DllImport con C++ non tornare correttamente
extern "C" __declspec(dllexport) bool Exist(const char* name)
{
//if (g_Queues.find(name) != g_Queues.end())
// return true;
//else
// return false;
return false;
}
Dentro la mia classe C# ho la seguente:
[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]
public static extern bool Exist(string name);
Eppure, ogni volta che io chiamo il mio Funziona SEMPRE restituisce true, anche quando ho commentato la mia piccola funzione e l'ho resa falsa. Ho la sensazione che ci sia qualcosa di sbagliato nella mia convenzione di chiamata o in qualsiasi altro problema con P/Invocazione della mia DLL, probabilmente corrispondente alla stringa e al const char *, ma per ora sono completamente all'oscuro. Che cosa sto facendo di sbagliato? Perché restituisce vero invece di falso?
EDIT: ho capito questo non ha nulla a che fare con il const char * o una stringa, perché il problema persiste con una funzione vuota. Ho provato a cambiare la convenzione di chiamata tra Cdecl e StdCall e nessuno dei due funziona correttamente. Sono anche riuscito a eseguire il debug della mia DLL e viene chiamato correttamente e restituisce in effetti false, ma una volta tornato in C# in qualche modo è vero. Anche cambiare il CharSet non ha avuto alcun effetto. Mi sono assicurato di aver fornito il mio programma C# con la versione più recente e corretta della mia DLL ogni volta, quindi non dovrebbe esserci un problema. Ancora una volta, sono completamente all'oscuro del perché il risultato sia vero quando in effetti sto restituendo false.
EDIT2: SOReader mi ha fornito un suggerimento che corregge un altro tema importante, vedi il mio commento. Purtroppo, non risolve il problema di ritorno.
Edit3: ho concluso che cambiando il tipo di ritorno di Exist (bool) in (int) rende improvvisamente restituire il numero corretto (true = 1, false = 0). Ciò significherebbe che potrebbe esserci un problema tra il bool di C++ e il booster di C#. Posso continuare a usare int come bool, ma questo non spiegherebbe il problema originale. Forse qualcun altro può illuminarmi su questo? Forse ha a che fare con il fatto che sto usando x64 (anche se entrambi i pacchetti sono compilati come x86)
La prima cosa da controllare è che la funzione è di fatto 'cdecl'. Se il tuo makefile passa 'Gz' o' Gr' al compilatore, la funzione sopra non è 'cdecl'. Aggiungi un '__cdecl' al tuo codice C, o abilita l'assistente di debug gestita' pInvokeStackImbalance'. –
Non penso che collegherà se/Gr o/Gz sono specificati. Buon punto a proposito del Managed Debugging Assistant. –
L'ho provato e __fastcall non si collegherà con/clr. Ma i collegamenti __stdcall (/ Gz) ma il punto di accesso Exist non viene trovato in fase di esecuzione poiché la firma della funzione è diversa. –