2012-04-10 16 views
5

ho questo nella mia dll creato in C++Array Handling tornato da C++ dll a C#

extern "C" __declspec(dllexport) 
    char* __stdcall hh() 
{ 
    char a[2]; 
    a[0]='a'; 
     a[1]='b'; 
    return(a); 
} 

Ed è così che sto cercando di gestire il codice in C#

[DllImport(@"mydll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]  
     public static extern IntPtr hh(); 
     static void Main(string[] args) 
     { 
      IntPtr a = hh(); 
      //How to proceed here??? 
     } 


    } 

Aiuto nel procedere ulteriore.

+0

Qual è esattamente la tua domanda? –

+0

Voglio stampare l'array returend dal codice C++ in C# – pushE

risposta

-2

Provare a utilizzare StringBuilder come valore di ritorno.

1

La risposta sarebbe

string stra = Marshal.PtrToStringAnsi(a); 

ma avete anche il problema che la DLL restituisce spazzatura per il codice come char * è una stringa c stile locale. sarebbe ok se si desidera restituire qualcosa del genere:

const char* str = "Hello from DLL."; 
+0

Voglio passare array di stringhe non una singola stringa – pushE

+0

Ok. Misunderstood that bit. La speranza aiuta comunque. – ervinbosenbacher

3

v'è alcun modo per gestire tali matrici. char a[2] è allocato nello stack nella tua funzione C++ e viene distrutto non appena si ritorna da esso. Dovresti o passare un array da C# e riempirlo nel codice C++ o allocare array nell'heap e fornire alcuni mezzi per liberarlo.

Quando è corretto, la gestione dipenderà dal modo in cui si restituiscono i dati dal codice C++. Se è ancora IntPtr è possibile utilizzare i metodi Marshal.ReadByte per leggere i caratteri dalla memoria e utilizzare i metodi di codifica per convertire quei byte in stringa, se necessario.

 

const int bufferSize = 2; // suppose it's some well-known value. 
IntPtr p = ...; // get this pointer somehow. 
for (var i = 0; i != bufferSize; ++i) 
{ 
    var b = Marshal.ReadByte(p, i); 
    Console.WriteLine(b); 
} 
 
2

ho ottenuto una soluzione come segue ::

nostro codice C++ è la seguente

extern "C" __declspec(dllexport) 
    char** __stdcall hh() 
{ 
static char* myArray[3] = {"A1", "BB2", "CC3",}; 
    return myArray; 
} 

e C# è la seguente

[DllImport(@"ourdll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]  
     public static extern IntPtr hh(); 
     static void Main(string[] args) 
     { 
      IntPtr a = hh(); 
      int j = 0; 
      string[] s=new string[100]; 
      do 
      { 
       s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(a,4*j)); 
       j++; 
      } 
      while(s[j-1] != null); 
     } 

L'unico problema ora di fronte è che come possiamo sapere la dimensione della matrice in modo che in questa dichiarazione stringa [] s = nuova stringa [100]; non abbiamo bisogno di sprecare la nostra memoria.