2012-06-19 36 views
5

tengo una función en C++ void someFunc(char* arg1, int* arg2) que quiero reunir los parámetros como se utilizo esta función en C# (después de importar el archivo DLL) ..int Marshalling * a C#

Puede usted pls dime cómo debería Marshall, ya que estoy confundido aquí.

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

¿Debo usar un IntPtr aquí? No puedo pasar la dirección de cualquier variable int de C# para que caiga en el puntero en C++?

+0

En realidad, puede utilizar punteros nativos en C#, utilizando bloques de código inseguros. Aunque no lo recomendaría, ya que conduce a una API poco intuitiva. –

+1

Deberá describir el significado de esos indicadores. En particular, cuántos datos apuntan también, si la función mantiene los punteros después de que vuelve, y si desea pasar 'null' a ellos. – CodesInChaos

Respuesta

7

El problema es int* se puede utilizar para una gran cantidad de escenarios diferentes en C. Cómo se calcula esto depende un poco de lo que representa el int* arg2.

Por ejemplo, si solo está configurando el valor de un int, puede ordenarlo como ref int. Sin embargo, si el int* representa una matriz, querrá pasar una matriz (esto es poco probable, sin embargo, ya que no existe un término de longitud, que es común cuando se utiliza una matriz mediante un puntero).

+0

Y un 'char *' es aún más ambiguo. – CodesInChaos

+0

@CodeInChaos Sí, cualquier tipo de puntero tiene este problema. Siempre necesita saber lo que el lado nativo planea hacer con esta variable. –