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); } }
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); } }
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); } }
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); } }
// 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)); }
public static extern HRESULT CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out bool equivalent, out AssemblyComparisonResult comparisonResult);
// 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; } }
// 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); } }
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); }
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)); } }
// 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; } }
// 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; }
// 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; } }
// 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); } }
private static extern int CompareAssemblyIdentity(string pwzAssemblyIdentity1, bool fUnified1, string pwzAssemblyIdentity2, bool fUnified2, out bool pfEquivalent, out AssemblyComparisonResult pResult);
// 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);