[Mono-dev] A possible implementation for AssemblyName.ReferenceMatchesDefinition

Daniel Lo Nigro lists at dan.cx
Wed Aug 28 12:31:26 UTC 2013


To reach the Entity Framework developers, I'd suggest posting to their
discussion forums: http://entityframework.codeplex.com/discussions


On Wed, Aug 28, 2013 at 9:30 PM, mlgo <mlintner at sinenomine.net> wrote:

>
>
> Thanks, I had seen that link already. How would I find Entity Framework
> developers?
>
>
>
>           It looks like EF is using it to while iterating through the
> cache to select the assembly which matches the assemblyname being passed
> in. The function it is used in is
>
> DefaultAssemblyResolver.ResolveAssembly and they use it as follows:
>
>
>
>             // look in the already loaded assemblies
>             foreach (var current in GetAlreadyLoadedNonSystemAssemblies())
>             {
>                 if (AssemblyName.ReferenceMatchesDefinition(referenceName, new AssemblyName(current.FullName)))
>                 {
>                     return current;
>                 }
>             }
>
>
> I had been looking at that link but it contradicts even the MSDN
> description. It seems obvious that without logic to take version into
> account the version it cannot resolve a correct from incorrect dll.
>
>
>
> http://stackoverflow.com/questions/2494421/how-does-assemblyname-referencematchesdefinition-work
>
> I was digging around on that link Somewhere on that page there is a
> response by some other Microsoft developers, which give an explanation of
> the compare which at least would be able to tell one dll from another in a
> meaning full way which lead me to change the implementation to the
> following:
>
> public static bool ReferenceMatchesDefinition (AssemblyName reference,
>  AssemblyName definition)
>                  {
>                          if (reference == null)
>                                  throw new ArgumentNullException
> ("reference");
>
>                          if (definition == null)
>                                  throw new ArgumentNullException
> ("definition");
>
>                         if (!reference.Name.Equals(definition.Name,
> StringComparison.InvariantCultureIgnoreCase))
>                         {
>                           return false;
>                         }
>
>                         //
> http://stackoverflow.com/questions/2494421/how-does-assemblyname-referencematchesdefinition-work
>                         // "A ReferenceIdentity matches a
> DefinitionIdentity, if and only if the value of all the attributes
>                         // specified in the ReferenceIdentity match the
> value of the corresponding attributes of the DefinitionIdentity.
>                         // If an attribute is missing in the
> ReferenceIdentity, it matches any value for that attribute in
> DefinitionIdentity.
>                         // For example, Ref “name” matches Def “name,
> culture=neutral”, and Def “name, culture=en-us”.
>                         // But Ref “name, culture=neutral” does not match
> Def “name, culture=en-us”."
>                         if (reference.CultureInfo != null)
>                         {
>                           if (definition.CultureInfo == null ||
> reference.CultureInfo != definition.CultureInfo )
>                           {
>                            return false;
>                           }
>                         }.
>
>
>        byte [] refToken = reference.GetPublicKeyToken();
>        if (refToken != null && refToken.Length != 0)
>        {
>                  byte [] defToken = definition.GetPublicKeyToken();
>                      if (deftoken == null || defToken.Length != 4 ||
>                      refToken[0] != defToken[0] || refToken[1] !=
> defToken[1]  ||
>                      refToken[2] != defToken[2]  || refToken[3] !=
> defToken[3]  )
>                           {
>                            return false;
>                           }
>
>                             if (reference.Version != null)
>                              {
>                            if (definition.Version == null ||
> reference.Version != definition.Version )
>                             {
>                              return false;
>                             }
>                          }
>
>                        }
>
>                         return true ;
>                  }
>
> Don't know how Im going to find entity Framework developers. I always will
> write Unit Tests of course.
>  ------------------------------
> *From:* Marek Safar-2 [via Mono] [ml-node+[hidden email]<http://user/SendEmail.jtp?type=node&node=4660697&i=0>
> ]
> *Sent:* Wednesday, August 28, 2013 2:21 AM
>
> *To:* Mark Lintner
> *Subject:* Re: A possible implementation for
> AssemblyName.ReferenceMatchesDefinition
>
>   Hi,
>
>  This API is broken by design and it's not clear what it should really
> do. It'd probably be better to check with EF devs whether they really
> intended to use it and for what purposes. Even for naive implementation
> please write unit test and check whether it passes on .net
>
>
> http://stackoverflow.com/questions/2494421/how-does-assemblyname-referencematchesdefinition-work
>
>  Marek
>
>
>
> On Tue, Aug 27, 2013 at 5:29 PM, mlgo <[hidden email]<https://connect.emailsrvr.com/owa/UrlBlockedError.aspx>
> > wrote:
>
>> According to
>>
>> http://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.referencematchesdefinition.aspx
>>
>> The following is what is expected to be returned from
>> ReferenceMatchesDefinition.
>>
>> Returns a value indicating whether two assembly names are the same. The
>> comparison is based on the simple assembly names.
>>
>> This seems naïve but below is a tentative implementation of that. Any
>> ideas?
>>
>> public static bool ReferenceMatchesDefinition (AssemblyName reference,
>> AssemblyName definition)
>>                 {
>>                         if (reference == null)
>>                                 throw new ArgumentNullException
>> ("reference");
>>                         if (definition == null)
>>                                 throw new ArgumentNullException
>> ("definition");
>>                         if (reference.Name != definition.Name)
>>                                 return false;
>>
>>                         return reference.Name.Equals(definition.Name);
>>                 }
>>
>>
>>
>>
>> --
>> View this message in context:
>> http://mono.1490590.n4.nabble.com/A-possible-implementation-for-AssemblyName-ReferenceMatchesDefinition-tp4660683.html
>> Sent from the Mono - Dev mailing list archive at Nabble.com.
>> _______________________________________________
>> Mono-devel-list mailing list
>> [hidden email] <https://connect.emailsrvr.com/owa/UrlBlockedError.aspx>
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>
>
>
> _______________________________________________
> Mono-devel-list mailing list
> [hidden email] <https://connect.emailsrvr.com/owa/UrlBlockedError.aspx>
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
> ------------------------------
>  If you reply to this email, your message will be added to the discussion
> below:
>
> http://mono.1490590.n4.nabble.com/A-possible-implementation-for-AssemblyName-ReferenceMatchesDefinition-tp4660683p4660696.html
>  To unsubscribe from A possible implementation for
> AssemblyName.ReferenceMatchesDefinition, click here.
> NAML<http://mono.1490590.n4.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>
> ------------------------------
> View this message in context: RE: A possible implementation for
> AssemblyName.ReferenceMatchesDefinition<http://mono.1490590.n4.nabble.com/A-possible-implementation-for-AssemblyName-ReferenceMatchesDefinition-tp4660683p4660697.html>
> Sent from the Mono - Dev mailing list archive<http://mono.1490590.n4.nabble.com/Mono-Dev-f1517221.html>at Nabble.com.
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20130828/45e07a5c/attachment.html>


More information about the Mono-devel-list mailing list