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?
@Merci, une raison pour laquelle j'ai besoin de 'extern" C "' devant? – Graviton
@Ngu: c'est pourquoi: http://en.wikipedia.org/wiki/Name_mangling – ybungalobill
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