Posso dizer ao CLR para organizar objetos imutáveis entre AppDomains por referência?
Pergunta
Ao empacotar objetos entre AppDomains em .NET, o CLR serializará o objeto (se tiver o Serializable
atributo) ou irá gerar um proxy (se herdar de MarshalByRef
)
Com strings, entretanto, o CLR apenas passará a referência ao objeto string para o novo AppDomain.O CLR ainda garante a integridade, pois as strings .NET são imutáveis e qualquer alteração feita pelo segundo AppDomain na string não afetará o objeto original.
O que me leva à minha pergunta:existe uma maneira de informar ao CLR que meu tipo personalizado é imutável e, quando usado em comunicação remota, ele deve apenas passar a referência ao objeto, como faz com a classe string?
Solução
Marshalling é na verdade bastante complicado.
O comportamento que você está descrevendo é chamado de "empacotamento por sangramento", o tempo de execução o usa para empacotar strings (às vezes) e empacotar System.Threading.Thread SEMPRE.
Pelo que eu posso dizer, você não tem controle sobre isso (é mencionado no artigo que você pode definir o comportamento de empacotamento personalizado, mas não consigo encontrar nenhuma documentação sobre isso), você poderia passar um IntPtr e usar código inseguro para simular isso , mas parece um grande truque para mim.
Outras dicas
Acho que não, não.Acredito que isso, assim como os primitivos, é tratado diretamente pelo tempo de execução.
Você tem apenas duas semânticas de empacotamento no .NET Remoting:marshal por valor (SerializableAttribute) e marshal por referência (MarshalByRef).
Como você mencionou, as strings são organizadas por valor, já que System.String é decorado com SerializableAttribute.
Se você deseja passar seu objeto entre domínios de aplicativos e deseja apenas uma cópia (nenhuma alteração no objeto no domínio de aplicativo remoto afeta o objeto no domínio de aplicativo local), então o que você deseja é usar SerializableAttribute em sua classe.
Espero que isto ajude.