AssemblyNameEqualityComparer.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / Microsoft / VisualBasic / Activities / AssemblyNameEqualityComparer.cs / 1305376 / AssemblyNameEqualityComparer.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------

namespace Microsoft.VisualBasic.Activities 
{
    using System; 
    using System.Collections; 
    using System.Collections.Generic;
    using System.Reflection; 
    using System.Runtime;

    class AssemblyNameEqualityComparer : IEqualityComparer, IEqualityComparer
    { 
        public AssemblyNameEqualityComparer()
        { 
        } 

        public new bool Equals(object xparam, object yparam) 
        {
            if (xparam == null && yparam == null)
            {
                return true; 
            }
            return this.Equals(xparam as AssemblyName, yparam as AssemblyName); 
        } 

        public bool Equals(AssemblyName x, AssemblyName y) 
        {
            // this expects non-null AssemblyName
            if (x == null || y == null)
            { 
                return false;
            } 
 
            if (Object.ReferenceEquals(x, y))
            { 
                return true;
            }

            if (x.Name != null && y.Name != null) 
            {
                if (string.Compare(x.Name, y.Name, StringComparison.OrdinalIgnoreCase) != 0) 
                { 
                    return false;
                } 
            }
            else if (!(x.Name == null && y.Name == null))
            {
                return false; 
            }
 
            if (x.Version != null && y.Version != null) 
            {
                if (x.Version != y.Version) 
                {
                    return false;
                }
            } 
            else if (!(x.Version == null && y.Version == null))
            { 
                return false; 
            }
 
            if (x.CultureInfo != null && y.CultureInfo != null)
            {
                if (!x.CultureInfo.Equals(y.CultureInfo))
                { 
                    return false;
                } 
            } 
            else if (!(x.CultureInfo == null && y.CultureInfo == null))
            { 
                return false;
            }

            byte[] xArray = x.GetPublicKeyToken(); 
            byte[] yArray = y.GetPublicKeyToken();
            if (!IsSameKeyToken(xArray, yArray)) 
            { 
                return false;
            } 

            return true;
        }
 
        public int GetHashCode(object objparam)
        { 
            AssemblyName obj = objparam as AssemblyName; 
            if (obj == null)
            { 
                return 0;
            }
            return this.GetHashCode(obj);
        } 

        public int GetHashCode(AssemblyName obj) 
        { 
            int hashcode = 0;
 
            if (obj.Name != null)
            {
                hashcode ^= obj.Name.GetHashCode();
            } 

            if (obj.Version != null) 
            { 
                hashcode ^= obj.Version.GetHashCode();
            } 

            if (obj.CultureInfo != null)
            {
                hashcode ^= obj.CultureInfo.GetHashCode(); 
            }
 
            byte[] objArray = obj.GetPublicKeyToken(); 
            if (objArray != null)
            { 
                // distinguishing no PKToken from "PKToken = null" which is an array of length=0
                hashcode ^= objArray.Length.GetHashCode() + 1;
                if (objArray.Length > 0)
                { 
                    hashcode ^= BitConverter.ToUInt64(objArray, 0).GetHashCode();
                } 
            } 
            return hashcode;
        } 

        public static bool IsSameKeyToken(byte[] reqKeyToken, byte[] curKeyToken)
        {
            bool isSame = false; 

            if (reqKeyToken == null && curKeyToken == null) 
            { 
                // Both Key Tokens are not set, treat them as same.
                isSame = true; 
            }
            else if (reqKeyToken != null && curKeyToken != null)
            {
                // Both KeyTokens are set. 
                if (reqKeyToken.Length == curKeyToken.Length)
                { 
                    isSame = true; 
                    for (int i = 0; i < reqKeyToken.Length; i++)
                    { 
                        if (reqKeyToken[i] != curKeyToken[i])
                        {
                            isSame = false;
                            break; 
                        }
                    } 
                } 
            }
 
            return isSame;
        }
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK