12

在 .NET 中的 AppDomain 之间编组对象时,CLR 将序列化对象(如果它具有Serializable属性)或生成代理(如果它继承自MarshalByRef

但是,对于字符串,CLR 只会将对字符串对象的引用传递到新的 AppDomain。CLR 仍然确保完整性,因为 .NET 字符串是不可变的,并且第二个 AppDomain 对字符串的任何更改都不会影响原始对象。

这让我想到了我的问题:有没有办法告诉 CLR 我的自定义类型是不可变的,当用于远程处理时,它应该像处理字符串类一样传递对对象的引用?

4

3 回答 3

8

编组实际上相当棘手

您描述的行为称为“marshal-by-bleed”,运行时使用它来编组字符串(有时)和编组 System.Threading.Thread ALWAYS。

据我所知,您无法控制这一点(文章中提到您可以定义自定义编组行为,但我找不到任何文档),您可能会传递一个 IntPtr 并使用不安全的代码来模拟这个,但对我来说,这听起来像是一个巨大的黑客攻击。

于 2009-05-06T06:59:04.370 回答
0

我不这么认为,不。我相信这和原语一样,是由运行时直接处理的。

于 2009-05-05T13:53:00.920 回答
-1

在 .NET Remoting 中只有两种封送语义:按值封送 (SerializableAttribute) 和按引用封送 (MarshalByRef)。

正如您所提到的,字符串是按值编组的,因为 System.String 是用 SerializableAttribute 装饰的。

如果您想在应用程序域之间传递您的对象并且您只想要一个副本(远程应用程序域中的对象的更改不会影响本地应用程序域中的对象),那么您想要的是在您的类上使用 SerializableAttribute。

希望这可以帮助。

于 2009-05-05T20:12:09.807 回答