Appel de la fonction C ++ dans l’espace de noms à partir de C # avec DlImport, Entrypoint

J’ai lu plusieurs questions liées à la mienne, mais aucune des réponses multiples n’a fonctionné pour moi.

Je dois appeler une fonction à partir d’une DLL non gérée. J’ai la version 32 bits de la DLL dans SysWow64 et la version 64 bits dans le système32. En tout cas, je comstack pour x86. Je n’ai pas la source pour la DLL, donc recomstackr avec extern “C” n’est pas une option.

Les parties pertinentes du fichier include pour la DLL:

(...) #include  namespace SomeNamespace { (...) typedef std::wssortingng STRING; (...) class SomeClass { (...) static bool SomeFunc(const STRING& p1, bool p2); (...) } } 

En appelant SomeFunc, je reçois une exception: “Impossible de trouver le point d’entrée nommé ‘?” dans DllName.dll “(la traduction est à moi, peut être inexacte).

Ma déclaration en C #:

  [System.Runtime.InteropServices.DllImport("DllName.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?SomeFunc@SomeClass@SomeNamespace@@SA_NABV?$basic_ssortingng@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N@Z")] bool SomeFunc(ssortingng p1, bool p2); 

J’ai aussi essayé ce qui suit:

 [System.Runtime.InteropServices.DllImport("DllName.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "#15")] bool SomeFunc(ssortingng p1, bool p2); 

15 est la fonction ordinale selon Depends, et le EntryPoint dans la première version est également obtenu à partir de Depends.

Selon undname.exe, il s’agit de la déclaration d’origine de la fonction:

 public: static bool __cdecl SomeFunc(class ?? :: ?? ::Z::basic_ssortingng<wchar_t,str uct std::char_traits,class w::allocator,td,bool> const &, ?? ) throw( ?? ) 

Cela ne semble pas être l’parsing correcte; le bool doit être un paramètre pour FuncName, pas un paramètre de type pour basic_ssortingng. Cependant, je ne suis pas sûr que ce soit juste une erreur d’parsing de undname.exe ou quelque chose de plus grave.

Comment puis-je le réparer?

Mise à jour: Lorsque vous utilisez l’ordinal de la fonction comme point d’entrée, je ne reçois pas d’exception. J’appelle cela depuis l’événement Load d’un formulaire, et lors du débogage, j’ai perdu le contrôle. Je veux dire, je débogue avec le curseur sur la ligne SomeFunc (), j’appuie sur F10 et l’application continue comme si je n’étais pas en train de déboguer. Je n’ai pas une exception ThreadException ou une exception UnhandledException.

Le code d’appel:

 public bool CallSomeFunc() { try { SomeFunc("p1", true); } catch (Exception ex) { ex.ToSsortingng(); // I just use this to put a breakpoint while debugging. } return true; } 

Mettre fin à la mise à jour

Vous avez besoin de C ++ / CLI comme un wrapper pour appeler des méthodes à partir de classes C ++. PInvoke ne fonctionne qu’avec les fonctions globales exscopes.

Jetez un coup d’oeil à l’ encapsuleur C ++ / CLI pour le C ++ natif à utiliser comme référence dans C # .