2009-11-09 13 views
11

Je souhaite marshaler une structure à utiliser avec P/Invoke, mais cette structure contient un champ qui ne concerne que mon code managé, donc je ne sais pas veulent qu'il soit marshalé car il n'appartient pas à la structure native. Est-ce même possible? Je cherchais un attribut similaire à NonSerialized pour la sérialisation, mais il ne semble pas exister ...Comment ignorer un champ lors de la mise en forme d'une structure avec 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; 
} 

Toute suggestion serait appréciée

Répondre

6

Il n'y a pas moyen de faire le CLR ignorer un champ. J'utiliserais plutôt deux structures, et peut-être faire de l'un un membre de l'autre.

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

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

« Il n'y a pas moyen de faire le CLR ignorer un champ »: quelqu'un oui, vous avez probablement raison ... Je vais attendre quelques jours dans le cas a une autre idée, mais c'est probablement la meilleure réponse que je vais avoir. Merci ! –

1

Deux méthodes:

  1. Utilisez une classe au lieu d'une struct: les structures sont toujours passés par pointeur vers l'API Windows ou d'autres fonctions natives. Remplacer un appel à doThis(ref myStruct) avec un appel à doThis([In, Out] myClass) devrait faire l'affaire. Une fois que vous avez fait cela, vous pouvez simplement accéder à vos champs à ne pas être marshalés avec des méthodes. Comme je l'ai déjà dit, les structs sont (presque) toujours passés par référence: l'appelé ne connaît donc pas les dimensions de la structure: qu'en est-il simplement de laisser vos champs supplémentaires pour être les derniers? Lorsque vous appelez une fonction native qui a besoin du pointeur de votre structure et de la taille de la structure, reposez simplement sur sa taille, en donnant celle qu'elle aurait sans vos champs supplémentaires. Je ne sais pas si c'est une façon légale de rassembler une telle structure en l'obtenant d'une fonction native. Question secondaire: est-ce que le Marshaller traite les champs de la classe comme privés? (Je l'espère ...)

+2

Champ privé sont également marshalés –