我可以告诉CLR通过引用封装AppDomains之间的不可变对象吗?

Yon*_*ona 12 .net c# clr remoting appdomain

当在.NET中的AppDomains之间封送对象时,CLR将序列化对象(如果它具有该Serializable属性),或者它将生成代理(如果它继承自MarshalByRef)

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

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

Sam*_*ron 8

编组实际上相当棘手.

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

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