Pergunta

Estou desenvolvendo um aplicativo .net que heavely depende de plugins. O próprio aplicativo contém uma ligação a um servidor remoto.

Recentemente eu cavei em domínios de aplicação e vê-los como a solução ideal para isolar o código do plugin do resto da aplicação.

No entanto, há uma grande desvantagem que me faz incapaz de implementar os domínios de aplicação para sediar os plugins. Parece que não há nenhuma maneira de passar um objecto por referência a um outro domínio de aplicação, que é necessário para passar uma referência para o objecto de ligação.

Eu estava esperando que alguém poderia me dar uma solução alternativa para que eu possa passar uma referência a esse objeto.

Nota:. Criando um proxy está fora de questão, a camada de ligação já atua como um proxy desde as classes são gerados automaticamente

Nota 2:. System.AddIn não pode ser usado como ele não está disponível no quadro compacto

Foi útil?

Solução

Você já tentou decorrente MarshalByRefObject ? É uma dor na medida em que estraga a sua hierarquia de herança, mas eu acho que é o que você quer.

De docs:

MarshalByRefObject é a classe base para objetos que se comunicam através limites do domínio de aplicação por troca de mensagens usando um proxy. Objetos que não herdam MarshalByRefObject são implicitamente organizar por valor. Quando um controle remoto Aplicação Referências um marechal por valor do objeto, uma cópia do objeto é passadas através domínio de aplicação limites.

objetos MarshalByRefObject são acedida directamente dentro do limites da aplicação local domínio. A aplicação de uma primeira vez em um domínio de aplicativo remoto acessa um MarshalByRefObject, um proxy é passado para o aplicativo remoto. As chamadas subseqüentes no proxy são volta empacotado para o objeto residência no domínio do aplicativo local.

Tipos deve herdar MarshalByRefObject quando o tipo é utilizado em vários domínios de aplicação limites, e o estado da objeto não deve ser copiado porque o membros do objeto não são utilizáveis fora do domínio de aplicação onde eles foram criados.

Na minha experiência, ele pode ser muito limitante - você realmente precisa fazer o mínimo possível através do limite AppDomain, de preferência restringindo-se às operações que requerem apenas tipos primitivos, strings e matrizes de ambos. Isso pode muito bem ser devido a minha própria inexperiência em trabalhar com vários AppDomains, mas é apenas um aviso de que é um pouco de um campo minado.

Outras dicas

Para falar com a mesma instância entre AppDomains, que deve herdar MarshalByRefObject . Feito desta forma, todos os métodos de chamada ao objecto (incluindo propriedades etc) é realmente uma chamada de comunicação remota para o outro app-domínio. Isso ajuda?

Esteja ciente de que clean-up de proxies MarshalByRefObject são limpos com base em um contrato de arrendamento. Em suma, se você não usar o objeto para um tempo específico será recuperada. Você pode controlar isso, substituindo InitializeLifetimeService para retornar um objeto de locação, que combina com você precisa. Se você retornar null você efetivamente desativar a locação e, em seguida, o objeto só é recuperada quando o AppDomain é descarregado.

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