public AssemblyCacheInstallReferenceEnum(String assemblyName, GACVersion gacVersion = GACVersion.Net40) { IAssemblyName fusionName = null; int hr = 0; switch (gacVersion) { case GACVersion.Net40: hr = Utils.CreateAssemblyNameObject40( out fusionName, assemblyName, CreateAssemblyNameObjectFlags.CANOF_PARSE_DISPLAY_NAME, IntPtr.Zero); break; case GACVersion.Net20: hr = Utils.CreateAssemblyNameObject20( out fusionName, assemblyName, CreateAssemblyNameObjectFlags.CANOF_PARSE_DISPLAY_NAME, IntPtr.Zero); break; } if (hr >= 0) { switch (gacVersion) { case GACVersion.Net40: hr = Utils.CreateInstallReferenceEnum40(out refEnum, fusionName, 0, IntPtr.Zero); break; case GACVersion.Net20: hr = Utils.CreateInstallReferenceEnum20(out refEnum, fusionName, 0, IntPtr.Zero); break; } } if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } }
// See comments in UninstallAssembly public static String QueryAssemblyInfo(String assemblyName, GACVersion gacVersion = GACVersion.Net40) { if (assemblyName == null) { throw new ArgumentException("Invalid name", "assemblyName"); } var aInfo = new AssemblyInfo(); aInfo.cchBuf = 1024; // Get a string with the desired length aInfo.currentAssemblyPath = new String('\0', aInfo.cchBuf); IAssemblyCache ac = null; int hr = 0; switch (gacVersion) { case GACVersion.Net40: hr = Utils.CreateAssemblyCache40(out ac, 0); break; case GACVersion.Net20: hr = Utils.CreateAssemblyCache20(out ac, 0); break; } if (hr >= 0) { hr = ac.QueryAssemblyInfo(0, assemblyName, ref aInfo); } if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } return aInfo.currentAssemblyPath; }
// assemblyName has to be fully specified name. // A.k.a, for v1.0/v1.1 assemblies, it should be "name, Version=xx, Culture=xx, PublicKeyToken=xx". // For v2.0 assemblies, it should be "name, Version=xx, Culture=xx, PublicKeyToken=xx, ProcessorArchitecture=xx". // If assemblyName is not fully specified, a random matching assembly will be uninstalled. public static void UninstallAssembly(String assemblyName, InstallReference reference, out AssemblyCacheUninstallDisposition disp, GACVersion gacVersion = GACVersion.Net40) { var dispResult = AssemblyCacheUninstallDisposition.Uninstalled; if (reference != null) { if (!InstallReferenceGuid.IsValidGuidScheme(reference.GuidScheme)) { throw new ArgumentException("Invalid reference guid.", "guid"); } } IAssemblyCache ac = null; int hr = 0; switch (gacVersion) { case GACVersion.Net40: hr = Utils.CreateAssemblyCache40(out ac, 0); break; case GACVersion.Net20: hr = Utils.CreateAssemblyCache20(out ac, 0); break; } if (hr >= 0) { hr = ac.UninstallAssembly(0, assemblyName, reference, out dispResult); } if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } disp = dispResult; }
public static void InstallAssembly(String assemblyPath, InstallReference reference, AssemblyCommitFlags flags, GACVersion gacVersion = GACVersion.Net40) { if (reference != null) { if (!InstallReferenceGuid.IsValidGuidScheme(reference.GuidScheme)) { throw new ArgumentException("Invalid reference guid.", "guid"); } } IAssemblyCache ac = null; int hr = 0; switch (gacVersion) { case GACVersion.Net40: hr = Utils.CreateAssemblyCache40(out ac, 0); break; case GACVersion.Net20: hr = Utils.CreateAssemblyCache20(out ac, 0); break; } // hr = Utils.CreateAssemblyCache(out ac, 0); if (hr >= 0) { hr = ac.InstallAssembly((int)flags, assemblyPath, reference); } if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } }