Posso dizer ao CLR para organizar objetos imutáveis ​​entre AppDomains por referência?

StackOverflow https://stackoverflow.com/questions/824912

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top