2010-12-05 6 views
2

Cette question est similaire à this one.Impossible de trouver un point d'entrée (cpp)

Je souhaite exporter une fonction simple à partir de C++, appelée par C# via PInvoke. Ceci est ma définition de la fonction:

int fnValue() 
{ 
    return 42; 
} 

Et ceci est la définition d'exportation dans .h fichier:

__declspec(dllexport) int fnValue(); 

Voilà comment je Pinvoke la fonction:

[DllImport("WhatDll.dll")] 
    public static extern int fnValue(); 

simple, non? Mais je suis un

System.EntryPointNotFoundException: Impossible de trouver une entrée 'point nommé 'fnValue' dans DLL « WhatDll.dll'

J'utilise dumpbin pour vérifier ce qui est à l'intérieur WhatDll, et c'est ce que j'ai:

00000000 caractéristiques 4CFB5C95 temps timbre dateur Sun 5 décembre 2010 17:34:13 0.00 Version 1 base de ordinale 4 nombre de fonctions 4 nombre de noms

nom ordinal soupçon RVA

1 2 00011014 [email protected]@YAHXZ = @ILT+15([email protected]@YAHXZ) 

Note qu'il existe un charabia derrière le nom de la fonction fnValue.

C'est assez déroutant. Une idée?

Répondre

4

Essayez d'écrire

extern "C"__declspec(dllexport) int fnValue(); 
+0

@Merci, une raison pour laquelle j'ai besoin de 'extern" C "' devant? – Graviton

+2

@Ngu: c'est pourquoi: http://en.wikipedia.org/wiki/Name_mangling – ybungalobill

+2

Sans extern "C" devant le compilateur C++ applique "name mangling" ou "name decoration" aux noms de fonction afin de transmettre plus sémantique informations du compilateur à l'éditeur de liens. extern "C" dit au compilateur C++ pour éviter les références manquant aux identifiants. – VinS

0

Si vous compilez avec C++ utilisation du compilateur extern "C" exporter ou ajouter un fichier .def pour spécifier les noms d'exportation. En outre, __stdcall peut être nécessaire

Questions connexes