是否可以在没有FullName的情况下从GAC加载程序集?

我知道如何从文件名加载程序集,也从GAC加载程序集。 由于我的.msi文件会将一个dll项目放入GAC,我想知道是否可以从GAC加载它而不知道FullName(我的意思是只是使用程序集名称,甚至是dll文件名),因为我必须从另一个项目加载此程序集。

这是一段允许执行此操作的代码,例如:

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

请注意,如果您需要特定的处理器体系结构,因为它支持部分名称,您可以编写以下类似的东西:

  // 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"); 

这是实施:

  ///  /// Gets an assembly path from the GAC given a partial name. ///  /// An assembly partial name. May not be null. ///  /// The assembly path if found; otherwise null; ///  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); 

是的,这是GAC的重点。 在查看当前目录之前,运行时将首先查看GAC。