J'ai écrit une DLL C++ wrapper pour C# à appeler. La DLL a été testée et a bien fonctionné avec mon programme de test C++.C# & C++, erreur d'exécution lors de l'appel C++ dll à partir de C#
maintenant intégré avec C#, j'ai eu une erreur d'exécution et s'est écrasé. Impossible d'utiliser le débogueur pour afficher plus de détails.
Le côté C++ n'a qu'une seule méthode:
#ifdef DLLWRAPPERWIN32_EXPORTS
#define DLLWRAPPERWIN32_API __declspec(dllexport)
#else
#define DLLWRAPPERWIN32_API __declspec(dllimport)
#endif
#include "NB_DPSM.h"
extern "C" {
DLLWRAPPERWIN32_API int WriteGenbenchDataWrapper(string fileNameToAnalyze,
string parameterFileName,
string baseNameToSaveData,
string logFileName,
string& message) ;
}
du côté C#, il y a une définition,
[DllImport("..\\..\\thirdParty\\cogs\\DLLWrapperWin32.dll")]
public static extern int WriteGenbenchDataWrapper(string fileNameToAnalyze,
string parameterFileName,
string baseNameToSaveData,
string logFileName,
ref string message);
et un appel:
string msg = "";
int returnVal = WriteGenbenchDataWrapper(rawDataFileName,
parameterFileName, outputBaseName, logFileName, ref msg);
Je suppose qu'il doit être quelque chose de mal avec le dernier paramètre de la fonction. string&
en C++ devrait être ref string
en C#?
EDIT:
Avons-nous vraiment besoin du extern "C"
?
EDIT 2:
après que je retire la extern "C
de la dll, je me suis le EntryPointNotFoundException. Lorsque je regarde la DLL en utilisant DLL Export Viewer, j'ai trouvé le nom de la fonction est "int __cdecl WriteGenbenchDataWrapper (class std :: ..." Dois-je inclure le "__cdecl"?
Qu'est-ce qu'une 'chaîne' dans C? Un 'char *'? Si c'est la classe C++ String, je crois que le marshaller ne supporte pas le marshalling de/vers ce type. Aussi: Quelle exception obtenez-vous et où cela se produit-il? – dtb
Pourquoi ne pas utiliser le débogueur? –
@jeffamaphone: Probablement parce que le problème bloque le CLR, pas l'application de 5YrsLaterDBA. –