Пример #1
0
 private static extern int CompareAssemblyIdentityWithConfig(
     [MarshalAs(UnmanagedType.LPWStr)] string identity1,
     bool isUnified1,
     [MarshalAs(UnmanagedType.LPWStr)] string identity2,
     bool isUnified2,
     IntPtr asmConfigCookie,
     out bool areEquivalent,
     out AssemblyComparisonResult result);
		internal static bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
		{
			if (UseNativeFusion)
			{
				return CompareAssemblyIdentityNative(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
			}
			else
			{
				return CompareAssemblyIdentityPure(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
			}
		}
Пример #3
0
		internal static bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
		{
			if (UseNativeFusion)
			{
				bool equivalent;
				Marshal.ThrowExceptionForHR(CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out equivalent, out result));
				return equivalent;
			}
			else
			{
				return CompareAssemblyIdentityPure(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
			}
		}
Пример #4
0
 internal static int DefaultModelCompareAssemblyIdentity(
     string identity1,
     bool isUnified1,
     string identity2,
     bool isUnified2,
     out bool areEquivalent,
     out AssemblyComparisonResult result,
     IntPtr asmConfigCookie)
 {
     lock (assemblyIdentityGate)
     {
         return(CompareAssemblyIdentityWithConfig(
                    identity1,
                    isUnified1,
                    identity2,
                    isUnified2,
                    asmConfigCookie,
                    out areEquivalent,
                    out result));
     }
 }
 internal static int DefaultModelCompareAssemblyIdentity(
     string identity1,
     bool isUnified1,
     string identity2,
     bool isUnified2,
     out bool areEquivalent,
     out AssemblyComparisonResult result,
     IntPtr asmConfigCookie)
 {
     lock (s_assemblyIdentityGate)
     {
         return CompareAssemblyIdentityWithConfig(
             identity1,
             isUnified1,
             identity2,
             isUnified2,
             asmConfigCookie,
             out areEquivalent,
             out result);
     }
 }
Пример #6
0
        private static bool CompareAssemblyIdentityPure(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
        {
            ParsedAssemblyName name1;
            ParsedAssemblyName name2;

            if (!ParseAssemblyName(assemblyIdentity1, out name1) ||
                !ParseAssemblyName(assemblyIdentity2, out name2))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }

            bool partial = IsPartial(name1);

            if ((partial && unified1) || IsPartial(name2))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }
            if (!name1.Name.Equals(name2.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            if (name1.Name.Equals("mscorlib", StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.EquivalentFullMatch;
                return(true);
            }
            if (partial && name1.Culture == null)
            {
            }
            else if (!name1.Culture.Equals(name2.Culture, StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            if (IsStrongNamed(name2))
            {
                if (partial && name1.PublicKeyToken == null)
                {
                }
                else if (name1.PublicKeyToken != name2.PublicKeyToken)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    return(false);
                }
                if (partial && name1.Version == null)
                {
                    result = AssemblyComparisonResult.EquivalentPartialMatch;
                    return(true);
                }
                else if (name1.Version < name2.Version)
                {
                    if (unified2)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return(true);
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return(false);
                    }
                }
                else if (name1.Version > name2.Version)
                {
                    if (unified1)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return(true);
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return(false);
                    }
                }
                else
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
                    return(true);
                }
            }
            else
            {
                result = partial ? AssemblyComparisonResult.EquivalentPartialWeakNamed : AssemblyComparisonResult.EquivalentWeakNamed;
                return(true);
            }
        }
Пример #7
0
 // this is equivalent to the Fusion CompareAssemblyIdentity API
 public bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
 {
     return(Fusion.CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result));
 }
Пример #8
0
 public static extern HRESULT CompareAssemblyIdentity(string assemblyIdentity1, bool unified1,
                                                      string assemblyIdentity2, bool unified2, out bool equivalent, out AssemblyComparisonResult comparisonResult);
Пример #9
0
		// internal for use by mcs
		internal static bool CompareAssemblyIdentityPure(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
		{
			ParsedAssemblyName name1;
			ParsedAssemblyName name2;

			ParseAssemblyResult r1 = ParseAssemblyName(assemblyIdentity1, out name1);
			ParseAssemblyResult r2 = ParseAssemblyName(assemblyIdentity2, out name2);

			Version version1;
			if (unified1)
			{
				if (name1.Name == null || !ParseVersion(name1.Version, out version1) || version1 == null || version1.Revision == -1
					|| name1.Culture == null || name1.PublicKeyToken == null || name1.PublicKeyToken.Length < 2)
				{
					result = AssemblyComparisonResult.NonEquivalent;
					throw new ArgumentException();
				}
			}

			Version version2 = null;
			if (!ParseVersion(name2.Version, out version2) || version2 == null || version2.Revision == -1 
				|| name2.Culture == null || name2.PublicKeyToken == null || name2.PublicKeyToken.Length < 2)
			{
				result = AssemblyComparisonResult.NonEquivalent;
				throw new ArgumentException();
			}

			if (name2.Name != null && name2.Name.Equals("mscorlib", StringComparison.OrdinalIgnoreCase))
			{
				if (name1.Name != null && name1.Name.Equals(name2.Name, StringComparison.OrdinalIgnoreCase))
				{
					result = AssemblyComparisonResult.EquivalentFullMatch;
					return true;
				}
				else
				{
					result = AssemblyComparisonResult.NonEquivalent;
					return false;
				}
			}

			if (r1 != ParseAssemblyResult.OK)
			{
				result = AssemblyComparisonResult.NonEquivalent;
				switch (r1)
				{
					case ParseAssemblyResult.DuplicateKey:
						throw new System.IO.FileLoadException();
					case ParseAssemblyResult.GenericError:
					default:
						throw new ArgumentException();
				}
			}

			if (r2 != ParseAssemblyResult.OK)
			{
				result = AssemblyComparisonResult.NonEquivalent;
				switch (r2)
				{
					case ParseAssemblyResult.DuplicateKey:
						throw new System.IO.FileLoadException();
					case ParseAssemblyResult.GenericError:
					default:
						throw new ArgumentException();
				}
			}

			if (!ParseVersion(name1.Version, out version1))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				throw new ArgumentException();
			}

			bool partial = IsPartial(name1, version1);

			if (partial && name1.Retargetable.HasValue)
			{
				result = AssemblyComparisonResult.NonEquivalent;
				throw new System.IO.FileLoadException();
			}
			if ((partial && unified1) || IsPartial(name2, version2))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				throw new ArgumentException();
			}
			if (!name1.Name.Equals(name2.Name, StringComparison.OrdinalIgnoreCase))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}
			if (partial && name1.Culture == null)
			{
			}
			else if (!name1.Culture.Equals(name2.Culture, StringComparison.OrdinalIgnoreCase))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}

			if (!name1.Retargetable.GetValueOrDefault() && name2.Retargetable.GetValueOrDefault())
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}

			// HACK handle the case "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes"
			// compared with "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=No"
			if (name1.PublicKeyToken == name2.PublicKeyToken
				&& version1 != null
				&& name1.Retargetable.GetValueOrDefault()
				&& !name2.Retargetable.GetValueOrDefault()
				&& GetRemappedPublicKeyToken(ref name1, version1) != null)
			{
				name1.Retargetable = false;
			}

			string remappedPublicKeyToken1 = null;
			string remappedPublicKeyToken2 = null;
			if (version1 != null && (remappedPublicKeyToken1 = GetRemappedPublicKeyToken(ref name1, version1)) != null)
			{
				name1.PublicKeyToken = remappedPublicKeyToken1;
				version1 = FrameworkVersion;
			}
			if ((remappedPublicKeyToken2 = GetRemappedPublicKeyToken(ref name2, version2)) != null)
			{
				name2.PublicKeyToken = remappedPublicKeyToken2;
				version2 = FrameworkVersion;
			}
			if (name1.Retargetable.GetValueOrDefault())
			{
				if (name2.Retargetable.GetValueOrDefault())
				{
					if (remappedPublicKeyToken1 != null ^ remappedPublicKeyToken2 != null)
					{
						result = AssemblyComparisonResult.NonEquivalent;
						return false;
					}
				}
				else if (remappedPublicKeyToken1 == null || remappedPublicKeyToken2 != null)
				{
					result = AssemblyComparisonResult.Unknown;
					return false;
				}
			}

			bool fxUnified = false;
			bool versionMatch = version1 == version2;
			if (IsFrameworkAssembly(name1))
			{
				fxUnified |= !versionMatch;
				version1 = FrameworkVersion;
			}
			if (IsFrameworkAssembly(name2) && version2 < FrameworkVersionNext)
			{
				fxUnified |= !versionMatch;
				version2 = FrameworkVersion;
			}

			if (IsStrongNamed(name2))
			{
				if (name1.PublicKeyToken != null && name1.PublicKeyToken != name2.PublicKeyToken)
				{
					result = AssemblyComparisonResult.NonEquivalent;
					return false;
				}
				else if (version1 == null)
				{
					result = AssemblyComparisonResult.EquivalentPartialMatch;
					return true;
				}
				else if (version1.Revision == -1 || version2.Revision == -1)
				{
					result = AssemblyComparisonResult.NonEquivalent;
					throw new ArgumentException();
				}
				else if (version1 < version2)
				{
					if (unified2)
					{
						result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
						return true;
					}
					else
					{
						result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
						return false;
					}
				}
				else if (version1 > version2)
				{
					if (unified1)
					{
						result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
						return true;
					}
					else
					{
						result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
						return false;
					}
				}
				else if (!versionMatch || fxUnified)
				{
					result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
					return true;
				}
				else
				{
					result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
					return true;
				}
			}
			else if (IsStrongNamed(name1))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}
			else
			{
				result = partial ? AssemblyComparisonResult.EquivalentPartialWeakNamed : AssemblyComparisonResult.EquivalentWeakNamed;
				return true;
			}
		}
Пример #10
0
        // internal for use by mcs
        internal static bool CompareAssemblyIdentityPure(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
        {
            ParsedAssemblyName name1;
            ParsedAssemblyName name2;

            ParseAssemblyResult r1 = ParseAssemblyName(assemblyIdentity1, out name1);
            ParseAssemblyResult r2 = ParseAssemblyName(assemblyIdentity2, out name2);

            Version version1;

            if (unified1)
            {
                if (name1.Name == null || !ParseVersion(name1.Version, out version1) || version1 == null || version1.Revision == -1 ||
                    name1.Culture == null || name1.PublicKeyToken == null || name1.PublicKeyToken.Length < 2)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    throw new ArgumentException();
                }
            }

            Version version2 = null;

            if (!ParseVersion(name2.Version, out version2) || version2 == null || version2.Revision == -1 ||
                name2.Culture == null || name2.PublicKeyToken == null || name2.PublicKeyToken.Length < 2)
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }

            if (name2.Name != null && name2.Name.Equals("mscorlib", StringComparison.OrdinalIgnoreCase))
            {
                if (name1.Name != null && name1.Name.Equals(name2.Name, StringComparison.OrdinalIgnoreCase))
                {
                    result = AssemblyComparisonResult.EquivalentFullMatch;
                    return(true);
                }
                else
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    return(false);
                }
            }

            if (r1 != ParseAssemblyResult.OK)
            {
                result = AssemblyComparisonResult.NonEquivalent;
                switch (r1)
                {
                case ParseAssemblyResult.DuplicateKey:
                    throw new System.IO.FileLoadException();

                case ParseAssemblyResult.GenericError:
                default:
                    throw new ArgumentException();
                }
            }

            if (r2 != ParseAssemblyResult.OK)
            {
                result = AssemblyComparisonResult.NonEquivalent;
                switch (r2)
                {
                case ParseAssemblyResult.DuplicateKey:
                    throw new System.IO.FileLoadException();

                case ParseAssemblyResult.GenericError:
                default:
                    throw new ArgumentException();
                }
            }

            if (!ParseVersion(name1.Version, out version1))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }

            bool partial = IsPartial(name1, version1);

            if (partial && name1.Retargetable.HasValue)
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new System.IO.FileLoadException();
            }
            if ((partial && unified1) || IsPartial(name2, version2))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }
            if (!name1.Name.Equals(name2.Name, StringComparison.OrdinalIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            if (partial && name1.Culture == null)
            {
            }
            else if (!name1.Culture.Equals(name2.Culture, StringComparison.OrdinalIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }

            if (!name1.Retargetable.GetValueOrDefault() && name2.Retargetable.GetValueOrDefault())
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }

            // HACK handle the case "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes"
            // compared with "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=No"
            if (name1.PublicKeyToken == name2.PublicKeyToken &&
                version1 != null &&
                name1.Retargetable.GetValueOrDefault() &&
                !name2.Retargetable.GetValueOrDefault() &&
                GetRemappedPublicKeyToken(ref name1, version1) != null)
            {
                name1.Retargetable = false;
            }

            string remappedPublicKeyToken1 = null;
            string remappedPublicKeyToken2 = null;

            if (version1 != null && (remappedPublicKeyToken1 = GetRemappedPublicKeyToken(ref name1, version1)) != null)
            {
                name1.PublicKeyToken = remappedPublicKeyToken1;
                version1             = FrameworkVersion;
            }
            if ((remappedPublicKeyToken2 = GetRemappedPublicKeyToken(ref name2, version2)) != null)
            {
                name2.PublicKeyToken = remappedPublicKeyToken2;
                version2             = FrameworkVersion;
            }
            if (name1.Retargetable.GetValueOrDefault())
            {
                if (name2.Retargetable.GetValueOrDefault())
                {
                    if (remappedPublicKeyToken1 != null ^ remappedPublicKeyToken2 != null)
                    {
                        result = AssemblyComparisonResult.NonEquivalent;
                        return(false);
                    }
                }
                else if (remappedPublicKeyToken1 == null || remappedPublicKeyToken2 != null)
                {
                    result = AssemblyComparisonResult.Unknown;
                    return(false);
                }
            }

            bool fxUnified = false;

            // build and revision numbers are ignored
            bool fxVersionMatch = version1.Major == version2.Major && version1.Minor == version2.Minor;

            if (IsFrameworkAssembly(name1))
            {
                fxUnified |= !fxVersionMatch;
                version1   = FrameworkVersion;
            }
            if (IsFrameworkAssembly(name2) && version2 < FrameworkVersionNext)
            {
                fxUnified |= !fxVersionMatch;
                version2   = FrameworkVersion;
            }

            if (IsStrongNamed(name2))
            {
                if (name1.PublicKeyToken != null && name1.PublicKeyToken != name2.PublicKeyToken)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    return(false);
                }
                else if (version1 == null)
                {
                    result = AssemblyComparisonResult.EquivalentPartialMatch;
                    return(true);
                }
                else if (version1.Revision == -1 || version2.Revision == -1)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    throw new ArgumentException();
                }
                else if (version1 < version2)
                {
                    if (unified2)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return(true);
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return(false);
                    }
                }
                else if (version1 > version2)
                {
                    if (unified1)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return(true);
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return(false);
                    }
                }
                else if (fxUnified || version1 != version2)
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
                    return(true);
                }
                else
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
                    return(true);
                }
            }
            else if (IsStrongNamed(name1))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            else
            {
                result = partial ? AssemblyComparisonResult.EquivalentPartialWeakNamed : AssemblyComparisonResult.EquivalentWeakNamed;
                return(true);
            }
        }
Пример #11
0
        internal static bool CompareAssemblyIdentityNative(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
        {
            bool equivalent;

            Marshal.ThrowExceptionForHR(CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out equivalent, out result));
            return(equivalent);
        }
Пример #12
0
 internal static bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
 {
     if (UseNativeFusion)
     {
         return(CompareAssemblyIdentityNative(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result));
     }
     else
     {
         return(CompareAssemblyIdentityPure(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result));
     }
 }
Пример #13
0
        // internal for use by mcs
        internal static bool CompareAssemblyIdentityPure(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
        {
            ParsedAssemblyName name1;
            ParsedAssemblyName name2;

            ParseAssemblyResult r = ParseAssemblyName(assemblyIdentity1, out name1);
            if (r != ParseAssemblyResult.OK || (r = ParseAssemblyName(assemblyIdentity2, out name2)) != ParseAssemblyResult.OK)
            {
                result = AssemblyComparisonResult.NonEquivalent;
                switch (r)
                {
                    case ParseAssemblyResult.DuplicateKey:
                        throw new System.IO.FileLoadException();
                    case ParseAssemblyResult.GenericError:
                    default:
                        throw new ArgumentException();
                }
            }

            bool partial = IsPartial(name1);

            if ((partial && unified1) || IsPartial(name2))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }
            if (!name1.Name.Equals(name2.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return false;
            }
            if (name1.Name.Equals("mscorlib", StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.EquivalentFullMatch;
                return true;
            }
            if (partial && name1.Culture == null)
            {
            }
            else if (!name1.Culture.Equals(name2.Culture, StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return false;
            }
            if (IsStrongNamed(name2))
            {
                if (partial && name1.PublicKeyToken == null)
                {
                }
                else if (name1.PublicKeyToken != name2.PublicKeyToken)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    return false;
                }
                if (partial && name1.Version == null)
                {
                    result = AssemblyComparisonResult.EquivalentPartialMatch;
                    return true;
                }
                else if (IsFrameworkAssembly(name2))
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
                    return true;
                }
                else if (name1.Version.Revision == -1 || name2.Version.Revision == -1)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    throw new ArgumentException();
                }
                else if (name1.Version < name2.Version)
                {
                    if (unified2)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return true;
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return false;
                    }
                }
                else if (name1.Version > name2.Version)
                {
                    if (unified1)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return true;
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return false;
                    }
                }
                else
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
                    return true;
                }
            }
            else if (IsStrongNamed(name1))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return false;
            }
            else
            {
                result = partial ? AssemblyComparisonResult.EquivalentPartialWeakNamed : AssemblyComparisonResult.EquivalentWeakNamed;
                return true;
            }
        }
Пример #14
0
		// this is equivalent to the Fusion CompareAssemblyIdentity API
		public bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
		{
			return Fusion.CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
		}
		private static bool CompareAssemblyIdentityNative(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
		{
			bool equivalent;
			Marshal.ThrowExceptionForHR(CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out equivalent, out result));
			return equivalent;
		}
Пример #16
0
		// internal for use by mcs
		internal static bool CompareAssemblyIdentityPure(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
		{
			ParsedAssemblyName name1;
			ParsedAssemblyName name2;

			if (!ParseAssemblyName(assemblyIdentity1, out name1)
				|| !ParseAssemblyName(assemblyIdentity2, out name2))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				throw new ArgumentException();
			}

			bool partial = IsPartial(name1);

			if ((partial && unified1) || IsPartial(name2))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				throw new ArgumentException();
			}
			if (!name1.Name.Equals(name2.Name, StringComparison.InvariantCultureIgnoreCase))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}
			if (name1.Name.Equals("mscorlib", StringComparison.InvariantCultureIgnoreCase))
			{
				result = AssemblyComparisonResult.EquivalentFullMatch;
				return true;
			}
			if (partial && name1.Culture == null)
			{
			}
			else if (!name1.Culture.Equals(name2.Culture, StringComparison.InvariantCultureIgnoreCase))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}
			if (IsStrongNamed(name2))
			{
				if (partial && name1.PublicKeyToken == null)
				{
				}
				else if (name1.PublicKeyToken != name2.PublicKeyToken)
				{
					result = AssemblyComparisonResult.NonEquivalent;
					return false;
				}
				if (partial && name1.Version == null)
				{
					result = AssemblyComparisonResult.EquivalentPartialMatch;
					return true;
				}
				else if (IsFrameworkAssembly(name2))
				{
					result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
					return true;
				}
				else if (name1.Version < name2.Version)
				{
					if (unified2)
					{
						result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
						return true;
					}
					else
					{
						result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
						return false;
					}
				}
				else if (name1.Version > name2.Version)
				{
					if (unified1)
					{
						result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
						return true;
					}
					else
					{
						result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
						return false;
					}
				}
				else
				{
					result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
					return true;
				}
			}
			else if (IsStrongNamed(name1))
			{
				result = AssemblyComparisonResult.NonEquivalent;
				return false;
			}
			else
			{
				result = partial ? AssemblyComparisonResult.EquivalentPartialWeakNamed : AssemblyComparisonResult.EquivalentWeakNamed;
				return true;
			}
		}
 private static extern int CompareAssemblyIdentityWithConfig(
     [MarshalAs(UnmanagedType.LPWStr)] string identity1,
     bool isUnified1,
     [MarshalAs(UnmanagedType.LPWStr)] string identity2,
     bool isUnified2,
     IntPtr asmConfigCookie,
     out bool areEquivalent,
     out AssemblyComparisonResult result);
Пример #18
0
        // internal for use by mcs
        internal static bool CompareAssemblyIdentityPure(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
        {
            ParsedAssemblyName name1;
            ParsedAssemblyName name2;

            ParseAssemblyResult r = ParseAssemblyName(assemblyIdentity1, out name1);

            if (r != ParseAssemblyResult.OK || (r = ParseAssemblyName(assemblyIdentity2, out name2)) != ParseAssemblyResult.OK)
            {
                result = AssemblyComparisonResult.NonEquivalent;
                switch (r)
                {
                case ParseAssemblyResult.DuplicateKey:
                    throw new System.IO.FileLoadException();

                case ParseAssemblyResult.GenericError:
                default:
                    throw new ArgumentException();
                }
            }

            bool partial = IsPartial(name1);

            if ((partial && unified1) || IsPartial(name2))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                throw new ArgumentException();
            }
            if (!name1.Name.Equals(name2.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            if (name1.Name.Equals("mscorlib", StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.EquivalentFullMatch;
                return(true);
            }
            if (partial && name1.Culture == null)
            {
            }
            else if (!name1.Culture.Equals(name2.Culture, StringComparison.InvariantCultureIgnoreCase))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            if (IsStrongNamed(name2))
            {
                if (partial && name1.PublicKeyToken == null)
                {
                }
                else if (name1.PublicKeyToken != name2.PublicKeyToken)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    return(false);
                }
                if (partial && name1.Version == null)
                {
                    result = AssemblyComparisonResult.EquivalentPartialMatch;
                    return(true);
                }
                else if (IsFrameworkAssembly(name2))
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
                    return(true);
                }
                else if (name1.Version.Revision == -1 || name2.Version.Revision == -1)
                {
                    result = AssemblyComparisonResult.NonEquivalent;
                    throw new ArgumentException();
                }
                else if (name1.Version < name2.Version)
                {
                    if (unified2)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return(true);
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return(false);
                    }
                }
                else if (name1.Version > name2.Version)
                {
                    if (unified1)
                    {
                        result = partial ? AssemblyComparisonResult.EquivalentPartialUnified : AssemblyComparisonResult.EquivalentUnified;
                        return(true);
                    }
                    else
                    {
                        result = partial ? AssemblyComparisonResult.NonEquivalentPartialVersion : AssemblyComparisonResult.NonEquivalentVersion;
                        return(false);
                    }
                }
                else
                {
                    result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
                    return(true);
                }
            }
            else if (IsStrongNamed(name1))
            {
                result = AssemblyComparisonResult.NonEquivalent;
                return(false);
            }
            else
            {
                result = partial ? AssemblyComparisonResult.EquivalentPartialWeakNamed : AssemblyComparisonResult.EquivalentWeakNamed;
                return(true);
            }
        }
Пример #19
0
 private static extern int CompareAssemblyIdentity(string pwzAssemblyIdentity1, bool fUnified1, string pwzAssemblyIdentity2, bool fUnified2, out bool pfEquivalent, out AssemblyComparisonResult pResult);
Пример #20
0
		private static extern int CompareAssemblyIdentity(string pwzAssemblyIdentity1, bool fUnified1, string pwzAssemblyIdentity2, bool fUnified2, out bool pfEquivalent, out AssemblyComparisonResult pResult);
Пример #21
0
 // this is equivalent to the Fusion CompareAssemblyIdentity API
 public bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
 {
     return(useNativeFusion
                         ? Fusion.CompareAssemblyIdentityNative(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result)
                         : Fusion.CompareAssemblyIdentityPure(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result));
 }
 internal static extern int CompareAssemblyIdentity(string pwzAssemblyIdentity1, [MarshalAs(UnmanagedType.Bool)] bool fUnified1, string pwzAssemblyIdentity2, [MarshalAs(UnmanagedType.Bool)] bool fUnified2, [MarshalAs(UnmanagedType.Bool)] out bool pfEquivalent, out AssemblyComparisonResult pResult);