2012-12-29 7 views
0

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".

+0

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 –

+0

Vous ne pouvez pas Pinvoke des fonctions qui prennent des objets C++ comme arguments. –

+0

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++. –

Répondre

0

Solution trouvée!

Tout d'abord, merci à tous ceux qui ont répondu. Se familiariser avec les nouvelles technologies (pour moi) a été un peu difficile). @Jim: Voir l'EDIT que j'ai ajouté. MQL (le langage metatrader) peut être basé sur C++ mais a été sérieusement enchaîné par les concepteurs de l'application. Donc, pas de types wchar. @Simon: L'ajout d'une référence au paquet NuGet "UnmanagedExports" place les wrappers et gère les corrections CIL pour vous, afin que vous puissiez vous concentrer sur votre code. Le lien que j'ai inclus dans la question détaille ceci.

Il y avait deux problèmes avec le code PHP:

  1. Dans l'exemple de code donné, des arguments de chaîne en fonction C# ont été déclarés comme LPWSTR (cordes larges). Les regarder dans le débogueur a montré qu'ils avaient des caractères d'apparence chinoise. LPStr fonctionne bien.

    public static int ReplaceString(
        [In, Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder str, 
        [MarshalAs(UnmanagedType.LPStr)]string a, 
        [MarshalAs(UnmanagedType.LPStr)]string b) 
    
  2. Exemple de code a également un pointeur sur chaîne déclarée comme argument dans le code de l'appelant (natif). Suppression de cela, et en utilisant la classe StringBuilder pour modifier la chaîne dans le code C# géré, travaillé.

    #import "MT4Lib.dll" 
        int ReplaceString(string str,string a,string b); 
        int Add(int x, int y); 
    #import 
    
+0

Si quelqu'un essaie de marshall chaînes aux terminaux MQL, ce lien sera très utile: https://www.mql5.com/fr/articles/249 – opewix

Questions connexes