visual studio check c# assemblies load gac

c# - studio - view assembly in gac



¿Es posible cargar un ensamblado desde el GAC sin el FullName? (2)

Sé cómo cargar un conjunto desde un nombre de archivo y también desde el GAC. Como Mi archivo .msi pondrá un proyecto dll en el GAC, me pregunto si es posible cargarlo desde el GAC sin saber el nombre completo (me refiero solo al nombre del ensamblado, o incluso al nombre del archivo dll), porque tengo que Cargue este conjunto desde otro proyecto.


Aquí hay un fragmento de código que permite hacer esto, y un ejemplo:

string path = GetAssemblyPath("System.DirectoryServices"); Assembly.LoadFrom(path);

Tenga en cuenta que si necesita una arquitectura de procesador específica, ya que admite nombres parciales, puede escribir este tipo de cosas:

// load from the 32-bit GAC string path = GetAssemblyPath("Microsoft.Transactions.Bridge.Dtc, ProcessorArchitecture=X86"); // load from the 64-bit GAC string path = GetAssemblyPath("Microsoft.Transactions.Bridge.Dtc, ProcessorArchitecture=AMD64");

Esta es la implementación:

/// <summary> /// Gets an assembly path from the GAC given a partial name. /// </summary> /// <param name="name">An assembly partial name. May not be null.</param> /// <returns> /// The assembly path if found; otherwise null; /// </returns> public static string GetAssemblyPath(string name) { if (name == null) throw new ArgumentNullException("name"); string finalName = name; AssemblyInfo aInfo = new AssemblyInfo(); aInfo.cchBuf = 1024; // should be fine... aInfo.currentAssemblyPath = new String(''/0'', aInfo.cchBuf); IAssemblyCache ac; int hr = CreateAssemblyCache(out ac, 0); if (hr >= 0) { hr = ac.QueryAssemblyInfo(0, finalName, ref aInfo); if (hr < 0) return null; } return aInfo.currentAssemblyPath; } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")] private interface IAssemblyCache { void Reserved0(); [PreserveSig] int QueryAssemblyInfo(int flags, [MarshalAs(UnmanagedType.LPWStr)] string assemblyName, ref AssemblyInfo assemblyInfo); } [StructLayout(LayoutKind.Sequential)] private struct AssemblyInfo { public int cbAssemblyInfo; public int assemblyFlags; public long assemblySizeInKB; [MarshalAs(UnmanagedType.LPWStr)] public string currentAssemblyPath; public int cchBuf; // size of path buf. } [DllImport("fusion.dll")] private static extern int CreateAssemblyCache(out IAssemblyCache ppAsmCache, int reserved);


Sí, este es el punto central del GAC. El tiempo de ejecución buscará primero en el GAC, antes incluso de buscar en el directorio actual.