He la siguiente función en C++ DLLfunción booleana C# DllImport con C++ no volver correctamente
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 de mi C# clase I tienen la siguiente:
[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]
public static extern bool Exist(string name);
Sin embargo, cada vez que llamo a mi funcionar SIEMPRE devuelve verdadero, incluso cuando comente mi pequeña función y la haga volver falsa. Tengo la sensación de que hay algo mal con mi convención de llamadas o cualquier otro problema con P/Invocar mi DLL, probablemente corresponde con la cadena y const char *, pero por ahora estoy completamente despistado. ¿Qué estoy haciendo mal? ¿Por qué se vuelve verdadero en lugar de falso?
EDIT: he dado cuenta de esto no tiene nada que ver con el char * const o cadena, porque el problema persiste con una función vacía. Intenté cambiar la convención de llamadas entre Cdecl y StdCall y tampoco funcionó correctamente. También he logrado depurar mi DLL y se está llamando correctamente y, de hecho, devuelve falso, pero una vez que vuelva a C#, de alguna manera es cierto. Cambiar el CharSet tampoco tuvo ningún efecto. Me he asegurado de haber suministrado mi programa C# con la versión más reciente y correcta de mi archivo DLL cada vez, así que eso tampoco debería ser un problema. Una vez más, no tengo ni idea de por qué el resultado es cierto cuando de hecho estoy devolviendo el nombre falso.
Edit2: SOReader me dio una sugerencia que fija otro tema importante, ver mi comentario. Lamentablemente, no soluciona el problema de devolución.
Edit3: I han concluido que el cambio del tipo de retorno de existir (bool) en (int) de repente hace que devuelve el número correcto (true = 1, false = 0). Eso significaría que puede haber un problema entre C++ bool y C# 's bool. Puedo continuar usando un int como bool, pero eso aún no explicaría el problema original. ¿Tal vez alguien más puede iluminarme en este caso? Quizás tiene que ver con el hecho de que estoy usando x64 (aunque ambos pojects están compilados como x86)
El primero que hay que comprobar es que la función es, de hecho, 'cdecl'. Si su makefile pasa 'Gz' o' Gr' al compilador, entonces la función anterior no es 'cdecl'. Agregue un '__cdecl' a su código C, o active el asistente de depuración administrado' pInvokeStackImbalance'. –
No creo que se vincule si se especifican/Gr o/Gz. Buen punto sobre el Asistente de depuración administrada. –
Lo probé y __fastcall no enlazará con/clr. Pero __stdcall (/ Gz) enlaces pero luego el punto de entrada Exist no se encuentra en el tiempo de ejecución ya que la firma de la función es diferente. –