Wie funktionieren die In- und Out-Attribute in .NET?

8

Ich habe versucht, ein Array über eine AppDomain -Begrenzung mit dem folgenden Code zu serialisieren:

%Vor%

Als Annahme, nachdem ich die Attribute an anderer Stelle bemerkt hatte, markierte ich die Parameter der Methode mit den Attributen [In] und [Out] , was dazu führte, dass sich die Parameter so verhielten, als ob sie per Referenz übergeben würden.

Zum Beispiel:

%Vor%

Bevor ich die Attribute hinzugefügt habe, ging der Inhalt der Variable buffer verloren, nachdem ich von der Methode über eine AppDomain Grenze zurückgekehrt bin.

Die Klasse ( SslStream ) erbte von MarshalByRefObject , war aber nicht mit dem Attribut Serializable gekennzeichnet. Ist dies die einzige Möglichkeit, einen Parameter als Wert zu übergeben? Werden diese Attribute irgendwie von .NET erkannt, wenn die Klasse serialisiert wird? Und führen sie wirklich dazu, dass der Parameter als Referenz übergeben wird oder werden die Inhalte einfach kopiert?

    
g t 30.01.2012, 22:56
quelle

1 Antwort

11

Dies ist eine bemerkenswert schlecht dokumentierte Funktion von .NET Remoting. Es hat nichts damit zu tun, ob Ihre Klasse [Serializable] ist oder von MarshalByRefObject abgeleitet ist. Hier wird erläutert, wie das -Argument über die AppDomain-Grenze gemarshallt wird. Der Anruf selbst wird von Remoting unter die Haube gestellt. Arrays nicht werden nach dem Aufruf automatisch zurückgematcht, was eindeutig eine Leistungsoptimierung ist. Nur das [Out] -Attribut ist erforderlich, [In] ist impliziert. Ich konnte keine relevante Dokumentation in MSDN finden, nur einen Blogpost von jemand, der das gleiche Problem hatte (scrollen Sie nach unten zu "Verwenden von OutAttribute in Remoting").

Ein Code zum Spielen:

%Vor%     
Hans Passant 31.01.2012, 03:27
quelle