当在.NET中的AppDomains之间封送对象时,CLR将序列化对象(如果它具有Serializable
属性),或者它将生成代理(如果它继承自MarshalByRef
)
使用字符串,CLR只会将对字符串对象的引用传递给新的AppDomain。 CLR仍然确保完整性,因为.NET字符串是不可变的,第二个AppDomain对字符串的任何更改都不会影响原始对象。
这让我想到了一个问题:有没有办法告诉CLR我的自定义类型是不可变的,当用于远程处理时,它应该像对象类一样传递对象的引用?
答案 0 :(得分:7)
编组实际上是fairly tricky。
您描述的行为称为“marshal-by-bleed”,运行时使用它来编组字符串(有时)并编组System.Threading.Thread ALWAYS。
据我所知,你无法控制它(它在文章中提到你可以定义自定义编组行为,但我找不到任何文档),你可能会传递一个IntPtr并使用不安全的代码模拟这个,但它闻起来像是一个巨大的黑客。
答案 1 :(得分:1)
我不这么认为,不。我相信这与原语一样,由运行时直接处理。
答案 2 :(得分:0)
在.NET Remoting中只有两个编组语义:按值编组(SerializableAttribute)和按引用编组(MarshalByRef)。
正如您所提到的,字符串是按值封送的,因为System.String是使用SerializableAttribute修饰的。
如果你想在app域之间传递你的对象而你只想要一个副本(远程应用程序域中的对象没有任何变化影响本地应用程序域中的对象)那么你想要的是使用SerializableAttribute你的班级。
希望这有帮助。