2009-05-05 7 views
12

Kiedy Organizowanie obiektów między AppDomains w .NET CLR będzie albo serializacji obiektu (jeśli ma atrybut Serializable) lub wygeneruje proxy (jeśli dziedziczy MarshalByRef)Czy mogę nakazać dziennikowi zmian przywracanie niezmiennych obiektów między domenami AppDomains przez odwołanie?

z ciągami jednak CLR będzie po prostu przechodzić odwołanie do obiektu string do nowej AppDomain. Środowisko CLR nadal zapewnia integralność, ponieważ ciągi .NET są niezmienne, a każda zmiana przez drugą AppDomain na ciąg nie wpłynie na oryginalny obiekt.

Co prowadzi mnie do mojego pytania: czy istnieje sposób, aby powiedzieć CLR, że mój niestandardowy typ jest niezmienny i kiedy jest używany w remotingu powinien po prostu przekazać odwołanie do obiektu, tak jak robi to z klasą string?

+0

Nie jestem pewien, czy jest to powiązane, ale czy sznurka jest ciągnięty, zanim pozwoli mu przekroczyć granicę? –

+0

Jeśli przez szpilkę rozumiesz jak ustalony blok {}, to nie, przypinanie jest używane tylko podczas wysyłania odwołań do obiektów na niezarządzanym terytorium. – Yona

Odpowiedz

7

Marshalling to tak naprawdę fairly tricky.

Zachowanie, które opisujesz nazywa się "marshal-by-bleed", środowisko wykonawcze używa go do marszałkowania strun (czasami) i marszałka System.Threading.Thread ZAWSZE.

O ile mogę powiedzieć, że nie masz nad tym kontroli (wspomniano w tym artykule, że możesz zdefiniować niestandardowe zachowanie rozrządowe, ale nie mogę znaleźć żadnej dokumentacji na jego temat), możesz potencjalnie przekazać IntPtr i użyć niebezpiecznego Kod do symulacji tego, ale pachnie jak ogromny hack do mnie.

+1

duży +1 za link, Marshall by Bleed jest interesujący – ShuggyCoUk

1

Nie sądzę, nie. Wierzę, że to, podobnie jak prymitywy, jest obsługiwane bezpośrednio przez środowisko wykonawcze.

0

Masz tylko dwie semantyki marshmatorskie w .NET Remoting: marszałek według wartości (SerializableAttribute) i marszałek według referencji (MarshalByRef).

Jak wspomnieliście, łańcuchy są marnowane przez wartość, ponieważ System.String jest ozdobiony SerializableAttribute.

Jeśli chcesz przekazać obiekt między domenami aplikacji, a chcesz tylko kopię (brak zmian w obiekcie w zdalnej domenie aplikacji wpływa na obiekt w lokalnej domenie aplikacji), to chcesz użyć SerializableAttribute na twojej klasie.

Mam nadzieję, że to pomoże.

+0

Niestety, połączony blog sambo99 wskazuje, że się mylisz, możesz chcieć zaktualizować – ShuggyCoUk

Powiązane problemy