public void GetAssemblyIdentities() { AssemblyIdentity[] names; names = GlobalAssemblyCache.GetAssemblyIdentities(new AssemblyName("mscorlib")).ToArray(); Assert.True(names.Length >= 1, "At least 1 mscorlib"); foreach (var name in names) { Assert.Equal("mscorlib", name.Name); } names = GlobalAssemblyCache.GetAssemblyIdentities(new AssemblyName("mscorlib"), ImmutableArray.Create(ProcessorArchitecture.MSIL, ProcessorArchitecture.X86)).ToArray(); Assert.True(names.Length >= 1, "At least one 32bit mscorlib"); foreach (var name in names) { Assert.Equal("mscorlib", name.Name); } names = GlobalAssemblyCache.GetAssemblyIdentities("mscorlib").ToArray(); Assert.True(names.Length >= 1, "At least 1 mscorlib"); foreach (var name in names) { Assert.Equal("mscorlib", name.Name); } names = GlobalAssemblyCache.GetAssemblyIdentities("System.Core, Version=4.0.0.0").ToArray(); Assert.True(names.Length >= 1, "At least System.Core"); foreach (var name in names) { Assert.Equal("System.Core", name.Name); Assert.Equal(new Version(4, 0, 0, 0), name.Version); Assert.True(name.GetDisplayName().Contains("PublicKeyToken=b77a5c561934e089"), "PublicKeyToken matches"); } names = GlobalAssemblyCache.GetAssemblyIdentities("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089").ToArray(); Assert.True(names.Length >= 1, "At least System.Core"); foreach (var name in names) { Assert.Equal("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", name.GetDisplayName()); } var n = new AssemblyName("System.Core"); n.Version = new Version(4, 0, 0, 0); n.SetPublicKeyToken(new byte[] { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 }); names = GlobalAssemblyCache.GetAssemblyIdentities(n).ToArray(); Assert.True(names.Length >= 1, "At least System.Core"); foreach (var name in names) { Assert.Equal("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", name.GetDisplayName()); } names = GlobalAssemblyCache.GetAssemblyIdentities("x\u0002").ToArray(); Assert.Equal(0, names.Length); names = GlobalAssemblyCache.GetAssemblyIdentities("\0").ToArray(); Assert.Equal(0, names.Length); names = GlobalAssemblyCache.GetAssemblyIdentities("xxxx\0xxxxx").ToArray(); Assert.Equal(0, names.Length); // fusion API CreateAssemblyEnum returns S_FALSE for this name names = GlobalAssemblyCache.GetAssemblyIdentities("nonexistingassemblyname" + Guid.NewGuid().ToString()).ToArray(); Assert.Equal(0, names.Length); }
private static string GetReferenceString(Reference reference) { if (!reference.StrongName) { return(reference.Path); } string name = reference.Name; if (name == "mscorlib") { // mscorlib is always loaded return(null); } // TODO: This shouldn't directly depend on GAC, rather we should have some kind of "reference simplifier". var possibleGacNames = GlobalAssemblyCache.GetAssemblyIdentities(name).ToArray(); if (possibleGacNames.Length == 0) { // no assembly with simple "name" found in GAC, use path to identify the reference: return(reference.Path); } string version = reference.Version; string culture = reference.Culture; string publicKeyToken = reference.PublicKeyToken; var fullName = string.Concat( name, ", Version=", version, ", Culture=", (culture == "") ? "neutral" : culture, ", PublicKeyToken=", publicKeyToken.ToLowerInvariant()); AssemblyIdentity identity; if (!AssemblyIdentity.TryParseDisplayName(fullName, out identity)) { // ignore invalid names: return(null); } var foundEquivalent = false; var foundNonEquivalent = false; foreach (var possibleGacName in possibleGacNames) { if (DesktopAssemblyIdentityComparer.Default.ReferenceMatchesDefinition(identity, possibleGacName)) { foundEquivalent = true; } else { foundNonEquivalent = true; } if (foundEquivalent && foundNonEquivalent) { break; } } if (!foundEquivalent) { // The reference name isn't equivalent to any GAC name. // The assembly is strong named but not GAC'd, so we need to load it from path: return(reference.Path); } if (foundNonEquivalent) { // We found some equivalent assemblies but also some non-equivalent. // So simple name doesn't identify the reference uniquely. return(fullName); } // We found a single simple name match that is equivalent to the given reference. // We can use the simple name to load the GAC'd assembly. return(name); }
private IEnumerable <AssemblyIdentity> GetAssemblyIdentities(string pathSoFar) { return(IOUtilities.PerformIO(() => GlobalAssemblyCache.GetAssemblyIdentities(pathSoFar), SpecializedCollections.EmptyEnumerable <AssemblyIdentity>())); }