Atualmente meu trabalho tem envolvido a manipulação / modificação de assemblies .NET, as vezes incluindo novos membros, outras mudando referências para tipos e/ou membros, etc.
Invariavelmente, de tempos em tempos acabo necessitando descobrir porque um assembly específico (vamos chamá-lo de A) possui uma referência para outro assembly (B); basicamente o que tenho que descobrir é quais tipos/membros do assembly B estão sendo referenciados (usados) pelo assembly A.
Existem várias formas de obter tal informação; na minha opinião, a mais simples, é converter, através do aplicativo ildasm que vem junto com o .NET Framework, o assembly em questão (A) para IL e procurar por referências para o assembly B; para tanto você pode fazer algo como:
c:\temp> ildasm /all /out=c:\temp\assembly-a.il assembly-a.dll
Depois de gerar o IL do assembly desejado seu próximo passo é procurar pelo nome do assembly que você deseja encontrar referências (neste exemplo, Assembly_B); você verá uma ou mais (para ser mais preciso, uma entrada para cada assembly referenciado) sessões parecidas com:
.assembly extern /*23000005*/ Assembly_B { }
Agora você pode tanto procurar pelo nome do assembly (Assembly_B) ou pelo número que se encontra à sua esquerda (neste exemplo 23000005)
.assembly extern /*23000005*/ Assembly_B { .ver 1:0:0:0 } . . . IL_0006: /* 28 | (0A)0000B2 */ call instance void [Assembly_B/*23000005*/]NamespaceName.TypeName::DoSomething() . . .
Como você pode notar no trecho de IL acima, no offset 06 do IL existe uma referência ao método DoSomething() da classe TypeName, definida no namespace 'Namespace' no assembly Assembly_B.
Happy coding.
(read this post in english)
No comments:
Post a Comment