Mam następujące funkcję w C++ DLLC# DllImport z C++ funkcja logiczna nie powraca poprawnie
extern "C" __declspec(dllexport) bool Exist(const char* name)
{
//if (g_Queues.find(name) != g_Queues.end())
// return true;
//else
// return false;
return false;
}
w moim C# klasy mam następujące:
[DllImport("Whisper.dll", EntryPoint="Exist", CallingConvention=CallingConvention.Cdecl)]
public static extern bool Exist(string name);
Jednak kiedy mogę zadzwonić funkcja ZAWSZE zwraca true, nawet gdy skomentowałem moją małą funkcję i zwróciłem wartość false. Mam wrażenie, że coś jest nie tak z moją konwencją wywoływania lub z jakimkolwiek innym problemem z P/wywoływaniem mojej DLL, prawdopodobnie odpowiadającym ciągowi znaków i const char *, ale na razie jestem całkowicie nieświadomy. Co ja robię źle? Dlaczego zwraca true zamiast false?
EDIT: I zorientowali się, to nie ma nic wspólnego z const char * lub ciąg, ponieważ problem nie został usunięty z pustym funkcji. Próbowałem zmienić konwencji wywoływania między Cdecl i StdCall i nie działają poprawnie. Udało mi się również zdebugować moją bibliotekę DLL i jest ona poprawnie wywoływana i rzeczywiście zwraca false, ale po powrocie do C# jest jakoś prawdą. Zmiana CharSet również nie przyniosła efektu. Upewniłem się, że za każdym razem dostarczałem mój program C# z najnowszą i poprawną wersją mojej biblioteki DLL, więc nie powinno to stanowić problemu. Ponownie, jestem całkowicie nieświadomy, dlaczego wynik jest prawdziwy, gdy w rzeczywistości wracam fałszywy.
EDIT2: SOReader warunkiem mnie z propozycją, która naprawia inny ważny problem, patrz mój komentarz. Niestety, nie rozwiązuje problemu z powrotem.
Edit3: I doszli do wniosku, że zmiana typu zwracanej istnieje (bool) do (int) sprawia, że nagle zwróci poprawną liczbę (true = 1, false = 0). Oznaczałoby to, że może wystąpić problem między boolem C++ a boolem C#. Mogę nadal używać int jako bool, ale to nadal nie wyjaśnia pierwotnego problemu. Może ktoś inny może mnie o tym poinformować? Być może ma to związek z faktem, że używam x64 (chociaż oba pliki są kompilowane jako x86)
Pierwszą rzeczą do sprawdzenia jest to, że funkcja ta jest w rzeczywistości 'cdecl'. Jeśli twój plik makefile przekazuje kompilatorowi 'Gz' lub' Gr', to powyższa funkcja nie jest 'cdecl'. Dodaj '__cdecl' do twojego kodu C lub włącz" Managed Debugging Assistant "pInvokeStackImbalance'. –
Nie sądzę, że będzie link, jeśli/Gr lub/Gz są określone. Dobry punkt na temat Managed Debugging Assistant. –
Przetestowałem to i __fastcall nie połączy się z/clr. Jednak linki __stdcall (/ Gz), ale punkt wejścia Exist nie zostanie znaleziony w czasie wykonywania, ponieważ sygnatura funkcji jest inna. –