Sto invocando una funzione non gestita nel mio codice C#.Attributi [In] [Out] Marshal's
La dichiarazione di questa funzione è la seguente:
int myFun(unsigned char* inputBuffer, unsigned char* &outputBuffer);
uso questa funzione come segue:
[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int myFun([In] byte[] inputBuffer, out IntPtr outputBuffer);
byte[] a = Encoding.ASCII.GetBytes("sampletext!");
IntPtr b;
res = myFun(a, out b);
Anche se citato [InAttribute]
per byte[] inputBuffer
, la funzione changeds ancora i valori di a
. Sembra che CLR stia utilizzando il proprio comportamento di marshalling predefinito. Ho usato byte[]
perché è equivalente a C# unsigned char*
.
Quando sostituisco byte[]
con char[]
, il CLR seguirà i miei attributi In-Out.
Apprezzo molto il vostro aiuto. Per maggiori informazioni leggere questo msdn page.
Forse "MarshalAs" è quello che stai cercando? – atlaste
Il marshaller pinvoke copia solo i dati quando deve. Non deve con byte [], si limita a pin l'array e passa un puntatore al primo elemento. Quindi il codice nativo parte direttamente sull'array gestito. Molto efficiente. Diverso per char [], gli elementi devono essere convertiti da un valore di 16 bit in un valore di 8 bit. Otterrai valori Encoding.Default. Il marshaller pinvoke * deve * copiare, non verrà copiato senza [Out]. –