2015-10-05 1 views
0

Je rencontre des difficultés pour appeler une fonction C++ depuis dll dans le projet VB.net. J'ai essayé avec les exemples simples ci-dessousPourquoi ai-je un message "Impossible de trouver un point d'entrée nommé 'SquareRoot' dans DLL"?

Pour C++ dll

#include <cmath> 
extern "C" __declspec(dllexport) double SquareRoot(double value) 
{ 
    return pow(value, 0.5); 
} 

Je construis la dll et le copier dans le dossier VB.net

Pour le projet VB.net

Module Module1 
    <Runtime.InteropServices.DllImport("DLL_Test.dll")> _ 
    Private Function SquareRoot(ByVal value As Double) As Double 

    End Function 

    Sub Main() 
     MsgBox(SquareRoot(2)) 
    End Sub 

End Module 

Je continue d'obtenir Additional information: Unable to find an entry point named 'SquareRoot' in DLL 'DLL_Test.dll'. Quand je lance dumpbin.exe sur DLL_Test.dll je reçois le texte suivant

File Type: DLL 

    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     4000 .text 
     10000 .textbss 

Je ne sais pas ce que je suis absent, des idées? Merci d'avance.

+1

Avez-vous utilisé '/ exports' lorsque vous avez exécuté' dumpbin'? –

+0

En outre, la fonction globale 'pow' vient de' '. '' fournit 'std :: pow' à la place. –

+0

On dirait que vous êtes en train de courir dans le mangling du côté C++. Vous pouvez utiliser Dependency Walker (http://www.dependencywalker.com/) pour afficher le nom de la fonction réelle que le code C++ exporte. En outre, cette question peut aider: http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function – Slapout

Répondre

1

Nom mutiler. extern "C" ne l'éteint pas, il change juste les règles.

Vous avez également un décalage de convention d'appel.

Vous pouvez résoudre à la fois à la fois par __stdcall mot-clé sur la fonction C++.

+0

Merci pour votre réponse, mais j'ai changé 'extern" C "__declspec (dllexport) double SquareRoot (double valeur)' à 'double __stdcall SquareRoot (double valeur)' mais je reçois toujours la même erreur –

+0

Je voulais combiner cela avec le code existant, ne pas enlever l'ancien annotations. –

+0

Je ne suis pas sûr que je suis, désolé, il a été une longue journée :) –