注册一个dll到GAC中,但是不会显示在程序集窗口中

我有这个代码注册DLL到我的gac

Assembly asm = Assembly.LoadFrom(argument); RegistrationServices regAsm = new RegistrationServices(); bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase); 

这工作正常,我越来越真正的bResult,但是当我打开GAC窗口,我期望看到那里的DLL,但事实并非如此。 谁能解释我为什么?

当我把dll放入GAC窗口时,我在那里看到它。

您的代码不会在GAC中注册程序集,但是,如此处所述,

注册托pipe程序集中的类以启用COM创build。

这是不一样的。

这很奇怪,这不是由.NET框架包装。 必要的融合声明是随时可用的。 这段代码运行良好:

 using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; static class GacUtil { public static void InstallAssembly(string path, bool forceRefresh) { IAssemblyCache iac = null; CreateAssemblyCache(out iac, 0); try { uint flags = forceRefresh ? 2u : 1u; int hr = iac.InstallAssembly(flags, path, IntPtr.Zero); if (hr < 0) Marshal.ThrowExceptionForHR(hr); } finally { Marshal.FinalReleaseComObject(iac); } } public static void UninstallAssembly(string displayName) { IAssemblyCache iac = null; CreateAssemblyCache(out iac, 0); try { uint whatHappened; int hr = iac.UninstallAssembly(0, displayName, IntPtr.Zero, out whatHappened); if (hr < 0) Marshal.ThrowExceptionForHR(hr); switch (whatHappened) { case 2: throw new InvalidOperationException("Assembly still in use"); case 5: throw new InvalidOperationException("Assembly still has install references"); case 6: throw new System.IO.FileNotFoundException(); // Not actually raised } } finally { Marshal.FinalReleaseComObject(iac); } } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")] internal interface IAssemblyCache { [PreserveSig] int UninstallAssembly(uint flags, [MarshalAs(UnmanagedType.LPWStr)] string assemblyName, IntPtr pvReserved, out uint pulDisposition); [PreserveSig] int QueryAssemblyInfo(uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string pszAssemblyName, IntPtr pAsmInfo); [PreserveSig] int CreateAssemblyCacheItem(/* arguments omitted */); [PreserveSig] int CreateAssemblyScavenger(out object ppAsmScavenger); [PreserveSig] int InstallAssembly(uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string pszManifestFilePath, IntPtr pvReserved); } [DllImport("mscorwks.dll", PreserveSig = false)] // NOTE: use "clr.dll" in .NET 4+ internal static extern void CreateAssemblyCache(out IAssemblyCache ppAsmCache, int reserved); } 

如果您正在使用此代码添加和删除程序集,请不要忘记在资源pipe理器窗口中按F5刷新视图。

您正在使用的方法是用于COM注册。 没有官方的做法。

Microsoft有一个关于如何使用未公开的GAC API的知识库

希望这可以帮助,