L'exportation de fonctions de dll C++ C# P/Invoke
J'ai construit une dll C++ que je voudrais appeler du code C#. Je suis en mesure d'appeler une fonction, mais l'autre déclenche une exception lorsque le code C# essaie de charger la dll.
L'en-tête ressemble à ceci:
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Ce qui produit une dll avec un peu déconcertantes, les exportations de la table (ce qui n'foo = foo dans le champ nom?):
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
Mes déclarations P/Invoke ressembler à ceci:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
L'appel à Installer retourne sans exception, mais quand je l'appelle PPPConnect, je reçois un MissingMethodException - "impossible de trouver un Point d'Entrée 'PPPConnect" dans un PInvoke DLL "PPPManager.dll'."
J'ai essayé de l'enlever externes et declspec directives de l'Installer déclaration de la fonction, de sorte que PPPConnect est la seule fonction exportée, et ce n'est toujours pas laissez-moi appeler PPPConnect.
J'ai aussi essayé de faire la DllImport par ordinal; cela donne le même résultat que l'appelant par son nom - Installer les rendements, mais PPPConnect lève l'exception "ne Peut pas trouver un Point d'Entrée '#2'...".
L'interopérabilité journal donne:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
C'est bien en dehors de mon domaine d'expertise, donc des suggestions ou des idées seraient les bienvenues.
Grâce,
Paul
edit:
Il s'avère que ce code fonctionne, le problème était avec la dernière dll pas être reproduit à l'appareil. Oh pinaise!
blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx j'ai juste commencé à l'utiliser pour essayer et déboguer ce problème, mais il me semble qu'il m'aurait sauvé beaucoup de temps de débogage MissingMethodExceptions.
OriginalL'auteur Symmetric | 2009-02-21
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide d'un .def fichier dans votre projet dll à l'exportation de ces fonctions? Si oui, retirez-la et essayez à nouveau. C'est juste une supposition, car il ressemble au votre, les exportations ne sont pas ce qu'elles doivent être quand vous faites un extern "C" declspec(dllexports).
J'ai essayé avec une simple dll C++ à l'aide de
et une simple application en C# à l'aide de vos déclarations PInvoke et il a bien fonctionné.
Quand j'ai fait un dumpbin exportations sur la dll que j'ai vu:
De vidage de fichier PPPManager.dll
Type de fichier: DLL
Section contient les éléments suivants pour les exportations PPPManager.dll
Avis que l'exportation noms sont différents dans mon cas.
Super! Content d'avoir pu aider.
OriginalL'auteur m-sharp
Il pourrait être quelque chose d'aussi simple que de
PPPConnect
à défaut d'une manière qui devient mal interprétés par le système d'exploitation. Essayez d'appliquer les deuxInstall
etPPPConnect
no-ops (juste avoir de retourTRUE
sans rien faire d'autre) et voir si l'erreur persiste. Si oui, essayez d'échanger l'ordre dans lequel ils sont exportés (toujours en no-ops) et voir si le problème est lié à la commande (peu probable) ou à autre chose.Vous pouvez également utiliser l'outil graphique
depends
pour confirmer ce que la DLL exportations de la table ressemble, mais je doute que le problème vient de ces quartiers.OriginalL'auteur vladr
Selon votre description de l'Installer et de PPPConnect diffère seulement dans les noms. Je suppose que vous utilisez tout simplement vieux .la version de la dll avec votre application en C#. Un un sans PPPConnect défini.
Les déclarations ressemble à droite (autant que je puisse en juger sans les sources).
OriginalL'auteur alex2k8
De bonnes informations, mais comme vous le mentionnez, tout est en ordre ici. Essayez d'installer les Outils de Débogage pour Windows et en cours d'exécution:
pour obtenir une meilleure image de la table des symboles; c'est un blind shot, mais vous pouvez également essayer:
dans le cas où l' __declspec est en train de faire quelque chose de bizarre.
OriginalL'auteur Paul Betts
utiliser dependency walker et ouvrir votre fichier DLL afin de vérifier quelles sont les méthodes disponibles
OriginalL'auteur datatoad