To add more detail: Basically, whenever you write AssemblyDefinition.ReadAssembly yourself, the assembly is not given to the resolver, as it wouldn't know what to do.
Rule of thumb for the pattern to work: * If you're calling ReadAssembly yourself, make sure to cache the assembly in the resolver if you want it to be used directly. Otherwise the resolver is free to open another instance. Jb On Fri, Nov 28, 2014 at 10:40 AM, Jb Evain <[email protected]> wrote: > The pattern should work, I use it almost everywhere :) > > There's one thing to note: when an AssemblyResolver is created, no > assemblies are automatically registered with it. > > I take it you're using: > > https://github.com/mono/mono-tools/blob/master/gendarme/framework/Gendarme.Framework/AssemblyResolver.cs > > So just write: > > AssemblyResolver.CacheAssembly (original); > > And now assembly resolving from AssemblyResolver.Resolver will resolve > using the cached original.dll. > > Jb > > On Fri, Nov 28, 2014 at 10:07 AM, Lior Tal <[email protected]> wrote: >> I tried to do what you suggested but it doesn't work: >> >> // Get a MethodDefinition from this assembly >> var assembly = AssemblyDefinition.ReadAssembly ("Original.dll", new >> ReaderParameters { AssemblyResolver = AssemblyResolver.Resolver }); >> >> .... >> >> // Get MethodReferences from this assembly, resolve them and compare using >> reference equality. >> var otherAssembly = AssemblyDefinition.ReadAssembly ("Scanned.dll", new >> ReaderParameters { AssemblyResolver = ar }); >> >> However i am getting no matches (no 2 instances that i compare are equal). >> >> On Thu, Nov 27, 2014 at 11:11 AM, Lior Tal <[email protected]> wrote: >>> >>> Yes i figured that's an ugly hack. I will follow your tips to do it >>> properly. >>> >>> >>> >>> On Thu, Nov 27, 2014 at 11:08 AM, Jb Evain <[email protected]> wrote: >>>> >>>> Yeah it doesn't :) >>>> >>>> Two obvious cases: >>>> >>>> 1) type will the same full name can be defined in multiple assemblies. >>>> 2) the name of generic parameter doesn't cross assemblies boundaries, >>>> so if you work on the defining assembly you can see an instantiation >>>> of Dictionary<TKey, TValue>, but in another assembly you'll see a >>>> Dictionary<!0, !1> for instance. >>>> >>>> And probably more I forgot right now. >>>> >>>> Jb >>>> >>>> >>>> On Thu, Nov 27, 2014 at 10:03 AM, Lior Tal <[email protected]> wrote: >>>> > Thanks i will look into that. >>>> > >>>> > As a hack for now i compare the ToString() of both types as it seems to >>>> > return the same method signature :) not sure whether that holds for all >>>> > cases... >>>> > >>>> > On Thu, Nov 27, 2014 at 10:59 AM, Jb Evain <[email protected]> wrote: >>>> >> >>>> >> Hey, >>>> >> >>>> >> Comparing metadata for equality is pretty hard, as not everyone has >>>> >> the same definition (there's a pretty good thread on this group about >>>> >> it). >>>> >> >>>> >> The way I usually implement it is as follow: >>>> >> >>>> >> * I maintain a shared assembly resolver to make sure that assemblies >>>> >> are never loaded twice. >>>> >> * This way when you encounter a MethodReference, you can Resolve it. >>>> >> * Then you can compare the MethodDefinition by reference equality. >>>> >> * For generic instances, you will need to still compare the resolved >>>> >> MethodDefinition by reference, and on top of that compare the >>>> >> instantiation. You can do the same trick to compare resolved types by >>>> >> identity. >>>> >> >>>> >> Jb >>>> >> >>>> >> On Wed, Nov 26, 2014 at 10:41 PM, Lior Tal <[email protected]> >>>> >> wrote: >>>> >> > Hey, >>>> >> > >>>> >> > I have a MethodReference that i'd like to search for in other >>>> >> > assemblies. >>>> >> > >>>> >> > I am iterating over all types, methods with bodies and instructions >>>> >> > to >>>> >> > find >>>> >> > the MethodReference usage as the instruction's operand. >>>> >> > >>>> >> > How do i compare it with the original MethodReference instance that >>>> >> > i >>>> >> > already have, to see that they match ? >>>> >> > >>>> >> > Reference equality does not work obviously, what is the proper way >>>> >> > of >>>> >> > doing >>>> >> > that ? >>>> >> > >>>> >> > --Lior >>>> >> > >>>> >> > -- >>>> >> > -- >>>> >> > -- >>>> >> > mono-cecil >>>> >> > --- >>>> >> > You received this message because you are subscribed to the Google >>>> >> > Groups >>>> >> > "mono-cecil" group. >>>> >> > To unsubscribe from this group and stop receiving emails from it, >>>> >> > send >>>> >> > an >>>> >> > email to [email protected]. >>>> >> > For more options, visit https://groups.google.com/d/optout. >>>> >> >>>> >> -- >>>> >> -- >>>> >> -- >>>> >> mono-cecil >>>> >> --- >>>> >> You received this message because you are subscribed to the Google >>>> >> Groups >>>> >> "mono-cecil" group. >>>> >> To unsubscribe from this group and stop receiving emails from it, send >>>> >> an >>>> >> email to [email protected]. >>>> >> For more options, visit https://groups.google.com/d/optout. >>>> > >>>> > >>>> > -- >>>> > -- >>>> > -- >>>> > mono-cecil >>>> > --- >>>> > You received this message because you are subscribed to the Google >>>> > Groups >>>> > "mono-cecil" group. >>>> > To unsubscribe from this group and stop receiving emails from it, send >>>> > an >>>> > email to [email protected]. >>>> > For more options, visit https://groups.google.com/d/optout. >>>> >>>> -- >>>> -- >>>> -- >>>> mono-cecil >>>> --- >>>> You received this message because you are subscribed to the Google Groups >>>> "mono-cecil" group. >>>> To unsubscribe from this group and stop receiving emails from it, send an >>>> email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>> >>> >> >> -- >> -- >> -- >> mono-cecil >> --- >> You received this message because you are subscribed to the Google Groups >> "mono-cecil" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. -- -- -- mono-cecil --- You received this message because you are subscribed to the Google Groups "mono-cecil" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
