2009-05-06 25 views
9

Estoy tratando de pasar una estructura de C# a la biblioteca C++. Paso estructura como un objeto, y la función C++ lo espera como un puntero (void *).¿Cómo clasifico una estructura como un puntero a una estructura?

Tengo problemas para pasar la estructura.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 

Aquí está el texto de la excepción de tiempo de ejecución consigo:

"No se puede reunir 'parámetro # 1': no ​​válida gestionado/combinación de tipo no administrado (este tipo de valor debe estar emparejado con Struct). "

Aunque encontré un artículo de MSDN que usa LPStruct exactamente en este contexto.

Ésta es mi estructura que estoy tratando de Mariscal:

[StructLayout(LayoutKind.Sequential)] 
public struct UserRec { 
    [MarshalAs(UnmanagedType.I4)] 
    public int userParam1; 
} 

Esta es la función C++:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {... 

Respuesta

17

Trate de pasar la estructura como un parámetro ref.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction(ref UserRec userRec); 

Cuando utiliza una referencia combinada con una estructura, conceptualmente pasa la dirección.

+4

Ni siquiera necesita el [MarshalAs] en este caso, creo. –

+0

@ Antón, está en lo correcto (actualizado) – JaredPar

+0

Resultado final de trabajo: public static extern IntPtr TheFunction ([MarshalAs (UnmanagedType.Struct), In] ref UserRec userRec); Y [MurshalAs] aquí es solo para hacerlo explícito, pero no obligatorio. –

13

Por cierto, UnmanagedType.LPStruct es raramente, si alguna vez, el argumento correcto MarshalAs. A quote from Adam Nathan que es un empleado de Microsoft:

UnmanagedType.LPStruct sólo se admite en un caso concreto: el tratamiento de un tipo de valor System.Guid como un GUID no administrado con un nivel extra de indirección.

+0

Pero quería que funcionara para PROPERTYKEY: '( – jnm2

+0

Por cierto, gracias por la explicación de por qué esto es así. Eso es lo que realmente quería. – jnm2

+0

(Espera, ¿qué es esta locura? Utilicé 'ref' en la firma pero no en el sitio de llamada! El lenguaje C# debe tener una excepción para las interfaces COM?) – jnm2

Cuestiones relacionadas