Impossible de trouver un point d'entrée lors de l'appel de dll C++ en C#
Je suis en train d'apprendre de P/Invoke, j'ai donc créé une simple dll en C++
KingFucs.h:
namespace KingFuncs
{
class KingFuncs
{
public:
static __declspec(dllexport) int GiveMeNumber(int i);
};
}
KingFuns.cpp:
#include "KingFuncs.h"
#include <stdexcept>
using namespace std;
namespace KingFuncs
{
int KingFuncs::GiveMeNumber(int i)
{
return i;
}
}
Afin de ne compiler, puis j'ai copié cette dll dans mon WPF dossier de débogage, avec le code:
[DllImport("KingFuncDll.dll", EntryPoint = "GiveMeNumber", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int GiveMeNumber(
int i
);
Et l'appel au clic de bouton:
private void Button_Click(object sender, RoutedEventArgs e)
{
int num = GiveMeNumber(123);
}
Mais il me donne exception:
Impossible de trouver un point d'entrée nommée "GiveMeNumber" dans la DLL
'KingFuncDll.dll'.
Vraiment.... qu'ai-je fait de mal... C'est évidemment en mesure de trouver la DLL, autrement, serait une autre exception. Mais mon nom de la méthode est exactement la même chose.... Je ne peux pas penser à autre raison.
Veuillez voir ma question ici: stackoverflow.com/questions/9849541/...
J'ai résolu même question, et de le décrire dans le ce post.
J'ai résolu même question, et de le décrire dans le ce post.
OriginalL'auteur King Chan | 2012-04-11
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
extern "C"
lorsque vous exportez votre fonction, de sorte que vous pouvez supprimer C++ name mangling. Et aussi vous ne devriez pas essayer de p/invoke pour les membres d'une classe. Utiliser les fonctions gratuites:Sur le côté géré votre
DllImport
attribut est tout faux. N'utilisez pas deSetLastError
qui est pour l'Api Win32. Ne pas la peine de réglageCharSet
si il n'y a pas de texte paramètres. Pas besoin deExactSpelling
. Et la convention d'appel est sans douteCdecl
.Vous n'avez pas besoin de définir une fonction au sein d'une classe en C++. Ancienne fonctions C sont juste très bien.
OriginalL'auteur David Heffernan
Le problème est que vous devez déclarer le C++ "fonction" à l'intérieur d'une classe C++ et disent de P/Invoke à utiliser StdCall.
Essayer de déclarer une fonction C++ à l'extérieur d'une classe et de et de les exporter comme vous l'avez fait. Ensuite, ton code devrait fonctionner.
Si vous devez vraiment avoir une fonction C++ à l'intérieur d'une classe, jetez un oeil à CallingConvention.ThisCall. Mais alors, vous êtes responsable pour la création de votre non géré instance de classe et de le passer comme le premier paramètre de votre appel de P/Invoke
OriginalL'auteur Pedro
Le point d'entrée le nom d'un fichier dll qui est donné dans les .exp fichier qui se trouve dans le dossier de débogage où d'autres fichiers source sont présents. Si dumpbin ne fonctionne pas, vous pouvez essayer cette.
OriginalL'auteur MetallicLord