2009-11-09 9 views
11

Ich möchte eine Struktur für die Verwendung mit P/Invoke marshale, aber diese Struktur enthält ein Feld, das nur für meinen verwalteten Code relevant ist, also nicht möchte, dass es gemarshallt wird, da es nicht in die native Struktur gehört. Ist es überhaupt möglich ? Ich war auf der Suche nach einem Attribute ähnlich wie NonSerialized für die Serialisierung, aber es scheint nicht zu existieren ...Wie kann ich ein Feld beim Marshalling einer Struktur mit 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; 
} 

Jeder Vorschlag

Antwort

6

würde geschätzt Es gibt keine Möglichkeit, die CLR ignoriert ein Feld zu machen. Ich würde stattdessen zwei Strukturen verwenden und vielleicht ein Mitglied des anderen machen.

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

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

„Es gibt keinen Weg, die CLR ignorieren, ein Feld zu machen“: ja, du hast wahrscheinlich recht ... Ich werde ein paar Tage warten, falls jemand eine andere hat Idee, aber das ist wahrscheinlich die beste Antwort, die ich bekommen werde. Vielen Dank ! –

1

zwei Methoden:

  1. eine Klasse verwenden statt einer Struktur: Strukturen werden immer durch Zeiger auf dem Windows-API oder andere native Funktionen übergeben. Einen Anruf zu doThis(ref myStruct) mit einem Anruf zu doThis([In, Out] myClass) zu ersetzen sollte den Trick tun. Sobald Sie dies getan haben, können Sie einfach mit Methoden auf Ihre nicht zu mapsenden Felder zugreifen.

  2. Wie bereits erwähnt, werden Strukturen (fast) immer als Referenz übergeben: daher weiß der Angerufene nichts über Strukturdimensionen: Wie wäre es, einfach Ihre zusätzlichen Felder als letzte zu belassen? Wenn Sie eine native Funktion aufrufen, die den Zeiger Ihrer Struktur und die Größe der Struktur benötigt, legen Sie einfach ihre Größe fest und geben Sie die ohne zusätzliche Felder an. Ich weiß nicht, ob es eine legale Möglichkeit ist, eine solche Struktur zurückzuerhalten, wenn man sie von einer nativen Funktion erhält. Side question: Verarbeitet der Marshaller Klassenfelder als privat? (Ich hoffe nicht ...)

+2

Private Feld sind auch gemarshallt –