2009-11-09 9 views
11

Quiero ordenar una estructura para usar con P/Invoke, pero esta estructura contiene un campo que solo es relevante para mi código administrado, por lo que no quiere que se clasifique porque no pertenece a la estructura nativa. ¿Es posible? Yo estaba buscando un atributo similar a NonSerialized para la serialización, pero no parece existir ...¿Cómo puedo ignorar un campo al ordenar una estructura con P/Invoke

struct MyStructure 
{ 
    int foo; 
    int bar; 

    [NotMarshaled] // This attribute doesn't exist, but that's the kind of thing I'm looking for... 
    int ignored; 
} 

Cualquier sugerencia sería apreciada

Respuesta

6

No hay manera de hacer que el CLR ignorar un campo. En cambio, usaría dos estructuras, y tal vez haga que una sea miembro de la otra.

struct MyNativeStructure 
{ 
    public int foo; 
    public int bar; 
} 

struct MyStructure 
{ 
    public MyNativeStruct native; 
    public int ignored; 
} 
+0

"No hay manera de hacer que el CLR ignorar un campo": sí, probablemente tengas razón ... Voy a esperar unos días por si alguien tiene otra idea, pero esa es probablemente la mejor respuesta que obtendré. Gracias ! –

1

dos métodos:

  1. utilizar una clase en lugar de una estructura: estructuras se pasan siempre por el puntero a la API de Windows u otras funciones nativas. Reemplazar una llamada al doThis(ref myStruct) con una llamada al doThis([In, Out] myClass) debería hacer el truco. Una vez que haya hecho esto, puede simplemente acceder a los campos que no se deben ordenar con métodos.

  2. Como ya indiqué, las estructuras son (casi) siempre pasadas por referencia: de ahí que el destinatario no sepa nada sobre las dimensiones de la estructura: ¿qué tal si dejamos sus campos adicionales para ser los últimos? Cuando llame a una función nativa que necesita el puntero de su estructura y el tamaño de la estructura, simplemente mienta acerca de su tamaño, dándole el que tendría sin sus campos adicionales. No sé si es una forma legal de organizar una estructura de ese tipo al obtenerla de una función nativa. Pregunta complementaria: ¿Marhaller procesa los campos de clase marcados como privados? (Espero que no ...)

+2

campo privado también se clasifican –

Cuestiones relacionadas