Pergunta

Existe uma maneira de modificar conjuntos .NET existentes sem recorrer a ferramentas de 3? Eu sei que PostSharp torna isso possível mas acho que é incrível desperdício que o developler de PostSharp basicamente tive que reescrever a funcionalidade de todo o namespace System.Reflection a fim de fazer montagens existentes modificável.

System.Reflection.Emit permite apenas a criação de novas montagens, dinâmicas. No entanto, todas as classes construtor usadas aqui herdam as classes básicas reflexão (por exemplo TypeBuilder herda de System.Type). Infelizmente, não parece ser uma maneira de coagir um tipo existente, carregado dinamicamente em um construtor de tipo. Pelo menos, não há nenhuma maneira oficial, suportado.

Assim que sobre não suportado? Alguém sabe de backdoors que permitem carregar montagens ou tipos existentes em tais classes construtor?

Mind, eu sou não à procura de maneiras de modificar a montagem atual (isto pode até ser um pedido razoável), mas apenas para modificar os conjuntos existentes carregados a partir do disco. Temo que não há tal coisa, mas eu gostaria de pedir de qualquer maneira.

No pior dos casos, a pessoa teria que recorrer a ildasm.exe desmontar o código e, em seguida, para ilasm.exe para a remontagem, mas não há nenhum conjunto de ferramentas (leia-se: IL leitor) (? Ou existe) contido em .NET para trabalhar com dados IL .

/ EDIT:

Eu não tenho nenhum caso de uso específico. Eu só estou interessado em uma solução de uso geral porque remendar os conjuntos existentes é uma tarefa bastante comum. Tome obfuscators por exemplo, ou profilers ou bibliotecas AOP (sim, o último pode ser implementados de forma diferente). Como eu disse, parece incrível desperdício de ser forçado a reescrever grande parte da infra-estrutura já existente no System.Reflection.


@Wedge:

Você tem razão. No entanto, não há nenhum caso de uso específico aqui. Eu tenho modificado a pergunta original para refletir isso. Meu interesse foi despertado por uma outra questão em que o consulente queria saber como ele poderia injetar o pop instruções e ret no final de cada método, a fim de manter o refletor de Lutz Roeder de reengenharia do (# VB ou C) código-fonte.

Agora, esse cenário pode ser realizado com uma série de ferramentas, por exemplo, PostSharp mencionado acima eo Reflexil plugin para refletor, que, por sua vez, usa o Cecil biblioteca.

Em suma, estou apenas não satisfeito com o .NET framework.

@ Joel:

Sim, eu estou ciente dessa limitação. Obrigado de qualquer forma para apontar isso, já que é importante.

@marxidad:

Esta parece ser a única abordagem viável. No entanto, isto significa que você ainda tem de recriar o conjunto completo usando as classes construtor, certo? Ou seja, você teria que passar por cima de toda a montagem manualmente.

Hmm, eu vou olhar para isso.

Foi útil?

Solução

Você pode usar MethodInfo.GetMethodBody (). GetILAsByteArray () , modificar isso, e depois ligá-lo de volta para MethodBuilder.CreateMethodBody () .

Outras dicas

Mono.Cecil também permite remover o nome forte de um determinado montagem e salvá-lo novamente como um conjunto sem sinal. Depois de remover o nome forte do assembly, você pode simplesmente modificar o IL do seu método de destino e usar o conjunto como faria com qualquer outro conjunto. Aqui está o link para remover o nome forte com Cecil:

http: //groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

Uma vez que você tenha removido o nome forte, você pode muito bem fazer o que quiser com a montagem. Divirta-se!

Seria bom se você poderia fornecer um caso de uso mais específico, há provavelmente melhores maneiras de resolver o problema do que isso.

Em NET 3.5 é possível adicionar métodos de extensão às classes quadro existentes, talvez isso é suficiente?

Um ponto importante:. Se o conjunto é assinado , quaisquer alterações irá falhar e você vai acabar com um dud

montagens .NET Framework são assinados e assim como Joel Coehoorn disse que você vai ter um insucesso.

Você pode carregar o assembly usando IronRuby, e mixin toda a funcionalidade que você pode sonhar

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