J'essaie d'appeler la fonction AC# dans une dll d'une application 3ème partie non géré - MetaTraderAppel/Rassemblant chaînes de dll C# au code non managé
J'ai suivi les conseils de Calling C# dll from unmanaged code cependant, l'exemple sur les chaînes de triage ne marche pas.
Note: J'ai réussi à appeler l'exemple d'addition de nombres entiers de la référence (fonction "Add"), et cela fonctionne de bout en bout sans problèmes, donc je sais que le problème est lié aux chaînes. C'est-à-dire que la fonction "ReplaceString" ne fonctionne pas. J'ai également regardé le site Web de Robert Gisiecke, mais il n'y a pas d'exemple de chaîne ici, ou je suis trop bête pour le comprendre.
Le message d'erreur que je reçois dans MetaTrader est:
15:27:40 2009.11.10 00:01 MT4LibTest EURUSD, H1: la fonction 'ReplaceString' appel de dll erreur critique 'Testme.dll' c0000005 à 040B031B .
plate-forme est Windows Server 2012 (64 bits) et je l'ai compilé à x86, car Metatrader est un programme x86
Encore une chose: je ne suis pas très expérimenté dans le monde VS, alors Im espérant que quelqu'un peut être assez bon pour aider
Merci
code C#:
[DllExport("ReplaceString", CallingConvention = CallingConvention.StdCall)]
public static int ReplaceString(
[In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder str,
[MarshalAs(UnmanagedType.LPWStr)]string a,
[MarshalAs(UnmanagedType.LPWStr)]string b)
{
str.Replace(a, b);
if (str.ToString().Contains(a)) return 1;
else
return 0;
}
fonction (Metatrader) appel:
#import "MT4Lib.dll"
int ReplaceString(string & str,string a,string b);
int Add(int x, int y);
#import
string str="A quick brown fox jumps over the lazy dog";
string stra = "fox";
string strb = "cat";
Print(str);
Print(ReplaceString(str,stra,strb));
Print(str);
EDIT: Je dois préciser que l'API metatrader qui permet d'écrire des 'scripts' n'autorise pas les types C++ complets. Donc, il n'y a pas de char, pas de wchar et certainement pas de pointeurs sur ces types. Seulement "chaîne".
Bienvenue sur StackOverflow. Vous ne pouvez pas passer une chaîne C++ à une application C#. Vous devrez probablement en faire un 'wchar *'.Voir aussi les questions connexes (à droite). Par exemple: http://stackoverflow.com/questions/643202/send-c-string-to-c-sharp-string-interop –
Vous ne pouvez pas Pinvoke des fonctions qui prennent des objets C++ comme arguments. –
Pour faire cette chose 'C++ appelant C#', je vous suggère d'utiliser COM à la place. Créez un objet COM en C# et utilisez-le en C++. –