2012-06-19 34 views
5

Ho una funzione in C++ void someFunc(char* arg1, int* arg2) cui voglio schierare i parametri come io uso questa funzione in C# (dopo l'importazione della DLL) ..Marshalling int * a C#

Can you pls dirmi come dovrei Marshall come sono confuso qui.

[DllImport(Dllname)] 
extern void someFunc([MarshallAsAttribute(UnmanagedType,LPStr)] string arg1, IntPtr arg2); 

Devo utilizzare un IntPtr qui? Non riesco a passare l'indirizzo di qualsiasi variabile int da C# in modo che possa finire nel puntatore in C++?

+0

È possibile utilizzare effettivamente i puntatori nativi in ​​C#, utilizzando blocchi di codice non sicuri. Anche se non lo consiglierei, perché conduce a un'API non intuitiva. –

+1

Avrai bisogno di descrivere il significato di quei puntatori. In particolare quanti dati puntano anche loro, se la funzione mantiene i puntatori dopo che è ritornata, e se si vuole passare "null" a loro. – CodesInChaos

risposta

7

Il problema è int* può essere utilizzato per molti diversi scenari in C. Il modo in cui viene eseguito il marshalling dipende un po 'da cosa rappresenta il int* arg2.

Ad esempio, se è solo l'impostazione di un valore di un int, è possibile effettuare il marshalling come ref int. Tuttavia, se lo int* rappresenta un array, ti consigliamo di passare un array (questo è improbabile, tuttavia, poiché non esiste un termine di lunghezza, che è comune quando si utilizza un array tramite un puntatore).

+0

E un 'char *' è ancora più ambiguo. – CodesInChaos

+0

@CodeInChaos Sì: qualsiasi tipo di puntatore presenta questo problema. Devi sempre sapere cosa sta pensando di fare la parte nativa con questa variabile. –