Pergunta

Deixe-me dar um cenário, em seguida, ver se alguém tem uma solução / solução alternativa.

Eu tenho uma biblioteca (DLL) que contém apenas classes. Em outra biblioteca, eu tenho interfaces que as classes no primeiro biblioteca implementar. Os clientes irão sempre referenciar apenas uma versão da biblioteca que contém os interfaces (sempre o mais recente) - e apenas adições será feita para as interfaces (mais interfaces / métodos). Além disso, haverá apenas uma versão de que a biblioteca de interfaces - para que os clientes não precisam de referências de atualização (a biblioteca de interfaces será carregado através da reflexão - por isso as regras de sondagem habituais não se aplicam, só podemos carregar o que o cliente especificamente pede). A biblioteca de implementar as interfaces terá várias versões que diferentes clientes de referência, ao mesmo tempo.

O problema ocorre quando um cliente de montagem está referenciando uma versão antiga da biblioteca de implementação. Ele cria um objeto de um tipo de classe na biblioteca de implementação - em seguida, passa para outra montagem cliente. Esse cliente montagem usa a versão mais recente (e único) da biblioteca de interfaces e tentativas de converter o objeto passado para ele com o tipo de interface adequado. Esta conversão falhar com a excepção 'System.TypeLoadException: Método X em tipo Y a partir de montagem Z não tem uma implementação'. Eu esperava essa exceção, pois na nova versão da interface (mesmo número de versão - antiga biblioteca clobbered), método X está definido, mas mesmo que a versão antiga do objeto que é passado contém metadados que diz que implementa a interface correspondente, a mapeamento falha no novo método de interface X porque ele não tem qualquer implementação dessa classe.

Então, minha pergunta é esta; Existe uma maneira de ter um uso cliente que interface, mas apenas causa uma exceção quando um método que não é implementada no objeto referenciado é chamado (e não a excepção a ser gerado quando o objeto referenciado é convertido para o tipo de interface mais recente)?

A propósito - a ligação tardia não é uma opção porque queremos intellisense / compilação tipo de tempo de verificação ... Além disso, eu sei como fazer isso com ponteiros de função e classes de mensagens publicitárias - Eu estava apenas esperando por uma solução melhor do que está mais em sintonia com os tipos regulares do NET.

Graças - Qualquer ajuda é muito apreciada

Foi útil?

Solução

Você pode usar um (MustInherit) classe abstrata, em vez de uma interface na biblioteca que contém as interfaces e definir os métodos e propriedades como Overridable. Desta forma, mesmo se os métodos jogou apenas uma exceção não implementado sempre haveria uma implementação para cada método na biblioteca interface. Ao tornar os métodos Overridable em vez de MustOverride deve evitar o TypeLoadException.

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