private void RoundTrip(AssemblyName name, bool testFullName = true) { AssemblyName rtName; FusionAssemblyIdentity.IAssemblyName obj; if (testFullName) { string fullName = name.FullName; obj = FusionAssemblyIdentity.ToAssemblyNameObject(fullName); rtName = FusionAssemblyIdentity.ToAssemblyName(obj); Assert.Equal(name.Name, rtName.Name); Assert.Equal(name.Version, rtName.Version); Assert.Equal(name.CultureInfo, rtName.CultureInfo); Assert.Equal(name.GetPublicKeyToken(), rtName.GetPublicKeyToken()); Assert.Equal(name.Flags, rtName.Flags); Assert.Equal(name.ContentType, rtName.ContentType); string displayName = FusionAssemblyIdentity.GetDisplayName(obj, FusionAssemblyIdentity.ASM_DISPLAYF.FULL); Assert.Equal(fullName, displayName); } obj = FusionAssemblyIdentity.ToAssemblyNameObject(name); rtName = FusionAssemblyIdentity.ToAssemblyName(obj); Assert.Equal(name.Name, rtName.Name); Assert.Equal(name.Version, rtName.Version); Assert.Equal(name.CultureInfo, rtName.CultureInfo); Assert.Equal(name.GetPublicKeyToken(), rtName.GetPublicKeyToken()); Assert.Equal(name.Flags, rtName.Flags); Assert.Equal(name.ContentType, rtName.ContentType); }
/// <summary> /// Looks up specified partial assembly name in the GAC and returns the best matching full assembly name/>. /// </summary> /// <param name="displayName">The display name of an assembly.</param> /// <param name="location">Full path name of the resolved assembly.</param> /// <param name="architectureFilter">The optional processor architecture.</param> /// <param name="preferredCulture">The optional preferred culture information.</param> /// <returns>An assembly identity or null, if <paramref name="displayName"/> can't be resolved.</returns> /// <exception cref="ArgumentNullException"><paramref name="displayName"/> is null.</exception> public static unsafe string ResolvePartialName( string displayName, out string location, ProcessorArchitecture[] architectureFilter = null, CultureInfo preferredCulture = null) { if (displayName == null) { throw new ArgumentNullException("displayName"); } location = null; FusionAssemblyIdentity.IAssemblyName nameObject = FusionAssemblyIdentity.ToAssemblyNameObject(displayName); if (nameObject == null) { return(null); } var candidates = GetAssemblyObjects(nameObject, architectureFilter); string cultureName = (preferredCulture != null && !preferredCulture.IsNeutralCulture) ? preferredCulture.Name : null; var bestMatch = FusionAssemblyIdentity.GetBestMatch(candidates, cultureName); if (bestMatch == null) { return(null); } string fullName = FusionAssemblyIdentity.GetDisplayName(bestMatch, FusionAssemblyIdentity.ASM_DISPLAYF.FULL); fixed(char *p = new char[MAX_PATH]) { ASSEMBLY_INFO info = new ASSEMBLY_INFO { cbAssemblyInfo = (uint)Marshal.SizeOf(typeof(ASSEMBLY_INFO)), pszCurrentAssemblyPathBuf = p, cchBuf = (uint)MAX_PATH }; IAssemblyCache assemblyCacheObject; CreateAssemblyCache(out assemblyCacheObject, 0); assemblyCacheObject.QueryAssemblyInfo(0, fullName, ref info); Debug.Assert(info.pszCurrentAssemblyPathBuf != null); Debug.Assert(info.pszCurrentAssemblyPathBuf[info.cchBuf - 1] == '\0'); var result = Marshal.PtrToStringUni((IntPtr)info.pszCurrentAssemblyPathBuf, (int)info.cchBuf - 1); Debug.Assert(result.IndexOf('\0') == -1); location = result; } return(fullName); }
public void FusionAssemblyNameRoundTrip() { RoundTrip(new AssemblyName("foo")); RoundTrip(new AssemblyName { Name = "~!@#$%^&*()_+={}:\"<>?[];',./" }); RoundTrip(new AssemblyName("\\,")); RoundTrip(new AssemblyName("\\\"")); RoundTrip(new AssemblyIdentity("foo").ToAssemblyName()); // 0xffff version is not included in AssemblyName.FullName for some reason: var name = new AssemblyIdentity("foo", version: new Version(0xffff, 0xffff, 0xffff, 0xffff)).ToAssemblyName(); RoundTrip(name, testFullName: false); var obj = FusionAssemblyIdentity.ToAssemblyNameObject(name); var display = FusionAssemblyIdentity.GetDisplayName(obj, FusionAssemblyIdentity.ASM_DISPLAYF.FULL); Assert.Equal("foo, Version=65535.65535.65535.65535, Culture=neutral, PublicKeyToken=null", display); RoundTrip(new AssemblyIdentity("foo", version: new Version(1, 2, 3, 4)).ToAssemblyName()); RoundTrip(new AssemblyName("foo") { Version = new Version(1, 2, 3, 4) }); RoundTrip(new AssemblyIdentity("foo", cultureName: CultureInfo.CurrentCulture.Name).ToAssemblyName()); RoundTrip(new AssemblyIdentity("foo", cultureName: "").ToAssemblyName()); RoundTrip(new AssemblyName("foo") { CultureInfo = CultureInfo.InvariantCulture }); RoundTrip(new AssemblyIdentity("foo", version: new Version(1, 2, 3, 4), cultureName: "en-US").ToAssemblyName()); RoundTrip(new AssemblyIdentity("foo", publicKeyOrToken: new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }.AsImmutableOrNull()).ToAssemblyName()); RoundTrip(new AssemblyIdentity("foo", version: new Version(1, 2, 3, 4), cultureName: CultureInfo.CurrentCulture.Name, publicKeyOrToken: new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }.AsImmutableOrNull()).ToAssemblyName()); RoundTrip(new AssemblyIdentity("foo", isRetargetable: true).ToAssemblyName()); RoundTrip(new AssemblyIdentity("foo", contentType: AssemblyContentType.WindowsRuntime).ToAssemblyName()); }