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.

Reply via email to