/// <summary> /// Constructor /// </summary> /// <param name="assembly">Assembly</param> public AssemblyRefUser(IAssembly assembly) { if (assembly == null) throw new ArgumentNullException("asmName"); this.version = assembly.Version ?? new Version(0, 0, 0, 0); this.publicKeyOrToken = assembly.PublicKeyOrToken; this.name = UTF8String.IsNullOrEmpty(assembly.Name) ? UTF8String.Empty : assembly.Name; this.locale = assembly.Culture; this.flags = publicKeyOrToken is PublicKey ? AssemblyAttributes.PublicKey : AssemblyAttributes.None; }
/// <summary> /// Constructor /// </summary> /// <param name="name">Simple name</param> /// <param name="version">Version</param> /// <param name="publicKey">Public key or public key token</param> /// <exception cref="ArgumentNullException">If any of the args is invalid</exception> public AssemblyRefUser(UTF8String name, Version version, PublicKeyBase publicKey) : this(name, version, publicKey, UTF8String.Empty) { }
/// <summary> /// Constructor /// </summary> /// <param name="name">Simple name</param> /// <param name="version">Version</param> /// <param name="publicKey">Public key or public key token</param> /// <param name="locale">Locale</param> /// <exception cref="ArgumentNullException">If any of the args is invalid</exception> public AssemblyRefUser(UTF8String name, Version version, PublicKeyBase publicKey, UTF8String locale) { if ((object)name == null) throw new ArgumentNullException("name"); if (version == null) throw new ArgumentNullException("version"); if ((object)locale == null) throw new ArgumentNullException("locale"); this.name = name; this.version = version; this.publicKeyOrToken = publicKey; this.locale = locale; this.flags = publicKey is PublicKey ? AssemblyAttributes.PublicKey : AssemblyAttributes.None; }
/// <summary> /// Constructor /// </summary> /// <param name="asm">The assembly</param> public AssemblyNameInfo(IAssembly asm) { if (asm == null) return; var asmDef = asm as AssemblyDef; this.hashAlgId = asmDef == null ? 0 : asmDef.HashAlgorithm; this.version = asm.Version ?? new Version(0, 0, 0, 0); this.flags = asm.Attributes; this.publicKeyOrToken = asm.PublicKeyOrToken; this.name = UTF8String.IsNullOrEmpty(asm.Name) ? UTF8String.Empty : asm.Name; this.culture = UTF8String.IsNullOrEmpty(asm.Culture) ? UTF8String.Empty : asm.Culture; }
/// <summary> /// Constructor /// </summary> /// <param name="asmName">Assembly name info</param> public AssemblyNameInfo(AssemblyName asmName) { if (asmName == null) return; this.hashAlgId = (AssemblyHashAlgorithm)asmName.HashAlgorithm; this.version = asmName.Version ?? new Version(0, 0, 0, 0); this.flags = (AssemblyAttributes)asmName.Flags; this.publicKeyOrToken = (PublicKeyBase)PublicKeyBase.CreatePublicKey(asmName.GetPublicKey()) ?? PublicKeyBase.CreatePublicKeyToken(asmName.GetPublicKeyToken()); this.name = asmName.Name ?? string.Empty; this.culture = asmName.CultureInfo != null && asmName.CultureInfo.Name != null ? asmName.CultureInfo.Name : string.Empty; }
public AssemblyRefInfo(AssemblyRef asmRef) { AssemblyRef = asmRef; OrigName = asmRef.Name; OrigPublicKeyOrToken = asmRef.PublicKeyOrToken; }
public AssemblyRefInfo(AssemblyRef asmRef) { this.AssemblyRef = asmRef; this.OrigName = asmRef.Name; this.OrigPublicKeyOrToken = asmRef.PublicKeyOrToken; }
/// <summary> /// Figures out which of two assembly names is closer to another assembly name /// </summary> /// <param name="requested">Requested assembly name</param> /// <param name="a">First</param> /// <param name="b">Second</param> /// <returns>-1 if both are equally close, 0 if <paramref name="a"/> is closest, 1 if /// <paramref name="b"/> is closest</returns> public int CompareClosest(IAssembly requested, IAssembly a, IAssembly b) { if (a == b) { return(0); } if (a == null) { return(!CompareName ? 1 : UTF8String.CaseInsensitiveEquals(requested.Name, b.Name) ? 1 : 0); } if (b == null) { return(!CompareName ? 0 : UTF8String.CaseInsensitiveEquals(requested.Name, a.Name) ? 0 : 1); } // Compare the most important parts first: // 1. Assembly simple name // 2. Public key token // 3. Version // 4. Locale // 5. Content type if (CompareName) { // If the name only matches one of a or b, return that one. bool na = UTF8String.CaseInsensitiveEquals(requested.Name, a.Name); bool nb = UTF8String.CaseInsensitiveEquals(requested.Name, b.Name); if (na && !nb) { return(0); } if (!na && nb) { return(1); } if (!na && !nb) { return(-1); } } if (ComparePublicKeyToken) { bool pa, pb; if (PublicKeyBase.IsNullOrEmpty2(requested.PublicKeyOrToken)) { // If one of them has a pkt but the other one hasn't, return the one with // no pkt. pa = PublicKeyBase.IsNullOrEmpty2(a.PublicKeyOrToken); pb = PublicKeyBase.IsNullOrEmpty2(b.PublicKeyOrToken); } else { // If one of them has the correct pkt, but the other one has an incorrect // pkt, return the one with the correct pkt. pa = PublicKeyBase.TokenEquals(requested.PublicKeyOrToken, a.PublicKeyOrToken); pb = PublicKeyBase.TokenEquals(requested.PublicKeyOrToken, b.PublicKeyOrToken); } if (pa && !pb) { return(0); } if (!pa && pb) { return(1); } } if (CompareVersion && !Utils.Equals(a.Version, b.Version)) { var rv = Utils.CreateVersionWithNoUndefinedValues(requested.Version); if (rv == new Version(0, 0, 0, 0)) { rv = new Version(ushort.MaxValue, ushort.MaxValue, ushort.MaxValue, ushort.MaxValue); } int va = Utils.CompareTo(a.Version, rv); int vb = Utils.CompareTo(b.Version, rv); if (va == 0) { return(0); // vb != 0 so return 0 } if (vb == 0) { return(1); // va != 0 so return 1 } if (va > 0 && vb < 0) { return(0); } if (va < 0 && vb > 0) { return(1); } // Now either both a and b's version > req version or both are < req version if (va > 0) { // a.Version and b.Version > req.Version. Pick the one that is closest. return(Utils.CompareTo(a.Version, b.Version) < 0 ? 0 : 1); } else { // a.Version and b.Version < req.Version. Pick the one that is closest. return(Utils.CompareTo(a.Version, b.Version) > 0 ? 0 : 1); } } if (CompareCulture) { bool la = Utils.LocaleEquals(requested.Culture, a.Culture); bool lb = Utils.LocaleEquals(requested.Culture, b.Culture); if (la && !lb) { return(0); } if (!la && lb) { return(1); } } if (CompareContentType) { bool ca = requested.ContentType == a.ContentType; bool cb = requested.ContentType == b.ContentType; if (ca && !cb) { return(0); } if (!ca && cb) { return(1); } } return(-1); }
AssemblyRef ReadAssemblyRef() { var asmRef = new AssemblyRefUser(); if (ownerModule != null) { ownerModule.UpdateRowId(asmRef); } asmRef.Name = ReadAssemblyNameId(); SkipWhite(); if (PeekChar() != ',') { return(asmRef); } ReadChar(); while (true) { SkipWhite(); int c = PeekChar(); if (c == -1 || c == ']') { break; } if (c == ',') { ReadChar(); continue; } string key = ReadId(); SkipWhite(); if (PeekChar() != '=') { continue; } ReadChar(); string value = ReadId(); switch (key.ToUpperInvariant()) { case "VERSION": asmRef.Version = Utils.ParseVersion(value); break; case "CONTENTTYPE": if (value.Equals("WindowsRuntime", StringComparison.OrdinalIgnoreCase)) { asmRef.ContentType = AssemblyAttributes.ContentType_WindowsRuntime; } else { asmRef.ContentType = AssemblyAttributes.ContentType_Default; } break; case "RETARGETABLE": if (value.Equals("Yes", StringComparison.OrdinalIgnoreCase)) { asmRef.IsRetargetable = true; } else { asmRef.IsRetargetable = false; } break; case "PUBLICKEY": if (value.Equals("null", StringComparison.OrdinalIgnoreCase) || value.Equals("neutral", StringComparison.OrdinalIgnoreCase)) { asmRef.PublicKeyOrToken = new PublicKey(); } else { asmRef.PublicKeyOrToken = PublicKeyBase.CreatePublicKey(Utils.ParseBytes(value)); } break; case "PUBLICKEYTOKEN": if (value.Equals("null", StringComparison.OrdinalIgnoreCase) || value.Equals("neutral", StringComparison.OrdinalIgnoreCase)) { asmRef.PublicKeyOrToken = new PublicKeyToken(); } else { asmRef.PublicKeyOrToken = PublicKeyBase.CreatePublicKeyToken(Utils.ParseBytes(value)); } break; case "CULTURE": case "LANGUAGE": if (value.Equals("neutral", StringComparison.OrdinalIgnoreCase)) { asmRef.Culture = UTF8String.Empty; } else { asmRef.Culture = value; } break; } } return(asmRef); }
void Add(PublicKeyBase a) { }
string GetFullName(PublicKeyBase pkBase) { return(Utils.GetAssemblyNameString(name, version, culture, pkBase, Attributes)); }