2010-11-06 6 views
1

J'ai C++ dll avec la classe dans laquelle je veux envoyer une chaîne de code C#, surly je ne peux pas utiliser de chaîne à cause de CLR, je serai obligé de changer la chaîne en char dans C++ dll, et envoyer un octet de C# (parce que C++ char = octet dans C#) mais C# ne comprends pas tableau C++ Je peux envoyer 1 octet et ce sera ok, mais pas tableau, s'il vous plaît aider! Code dll:En utilisant le code C++ dans C#

public ref class Coding 
    { 
    public: 
     void HillCoding(char filePath[]) 
     { 

      ... 
     } 
    }; 
+0

Pouvez-vous partager avec nous la signature de la fonction C++? – Raphael

+1

Lors de l'exécution avec 'P/Invoke', le CLR convertira' string' en 'char *' je crois –

+0

duplication possible de [Passer des chaînes non-terminées par un caractère non-nul en code non managé] (http://stackoverflow.com/questions/ 3435163/passage-non-null-terminated-strings-à-unmanaged-code) – Hogan

Répondre

1

Voici le code de travail d'appeler la fonction dll C++ de C#:

sbyte[] A_SB_array = new sbyte[0]; 
    ArrayConvCtoSB(ref A_SB_array, ar_param.ToCharArray()); 
    fixed (sbyte* SB_array = A_SB_array) 
     return CPSFEW.getDataLength(SB_array); 

Ce n'est pas « très bon code » mais il illustre ce que vous avoir besoin.

PS: Voici ArrayConvCtoSB. Je ne l'aime pas, c'est juste pour comprendre.

static private void ArrayConvCtoSB(ref sbyte[] to_sbyte, char[] from_char) 
    { 
     for (int i = 0; i < from_char.Length; i++) 
     { 
      Array.Resize(ref to_sbyte, to_sbyte.Length + 1); 
      to_sbyte[i] = (sbyte)from_char[i]; 
     } 
    } 

PPS: "fixe" est fortement nécessaire pour forceing garbage collector ne pas effacer la mémoire SB_array: sinon il peut. :)

+0

Un ajout de plus. Voici la déclaration de la fonction C++ getDataLength: "size_t getDataLength (const char * param) {...}" – Badiboy

+0

il a résolu le problème, thx man;) – ZAA

1

Essayez cette première, parce que CLR convertit string-char *, pas ?:

callThisCPlusPlusMethod(myString) 

Si cela ne fonctionne pas, utilisez

char[] sendArray = myString.ToCharArray(); 
callThisCPlusPlusMethod(sendArray); 

Ou, si nécessaire dans différents codage:

byte[] sendArray = Encoding.TheEncodingINeed.GetBytes(myString); 
callThisCPlusPlusMethod(sendArray); 

Note: J'ai tendance à des noms ambigus :)

+0

Erreur Argument 1: impossible de convertir de 'chaîne' en 'std.basic_string , std :: allocateur > * ' – ZAA

+0

Si votre signature est la même que celle ci-dessus, alors _théoriquement_ cela devrait fonctionner, je n'ai aucune idée de ce que serait le problème ... avez-vous essayé toutes les autres méthodes que j'ai postées? –