2012-06-19 5 views
5

Ich habe eine Funktion in C++ void someFunc(char* arg1, int* arg2), die ich die Parameter Marschall wollen, wie ich diese Funktion in C# (nach der DLL-Import) ..Rangierung int * zu C#

Können Sie mir pls sagen, wie ich sollte Marshall, wie ich hier verwirrt bin.

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

Soll ich hier ein IntPtr verwenden? Ich kann die Adresse von irgendeiner int-Variablen von C# nicht übergeben, damit es in dem Zeiger in C++ landet?

+0

Sie können native Zeiger in C# tatsächlich verwenden, indem Sie unsichere Codeblöcke verwenden. Obwohl ich es nicht empfehlen würde, da es für eine nicht intuitive API führt. –

+1

Sie müssen die Bedeutung dieser Zeiger beschreiben. Insbesondere, wie viele Daten sie auch zeigen, wenn die Funktion die Zeiger nach ihrer Rückkehr behält und wenn Sie ihnen "null" übergeben wollen. – CodesInChaos

Antwort

7

Das Problem ist int* kann für viele verschiedene Szenarien in C verwendet werden. Wie Sie marshallen hängt davon ab, was die int* arg2 soll darstellen.

Zum Beispiel, wenn es nur einen Wert eines int setzt, können Sie dies als ref int marshalieren. Wenn das int* jedoch ein Array darstellt, sollten Sie ein Array übergeben (dies ist jedoch unwahrscheinlich, da es keinen Längenausdruck gibt, der bei der Verwendung eines Arrays über einen Zeiger üblich ist).

+0

Und ein 'char *' ist noch mehrdeutig. – CodesInChaos

+0

@CodeInChaos Ja - jeder Zeigertyp hat dieses Problem. Sie müssen immer wissen, was die native Seite mit dieser Variable vorhat. –