C# 查询x64 GAC

C# 查询x64 GAC,c#,.net,winapi,gac,C#,.net,Winapi,Gac,使用下面的代码,我正在查询GAC,以查看它是否安装了特定的程序集。代码本身工作得很好,但我只得到了测试的结果。该组件安装在GACs GAC_64和GAC_32中 我必须做什么才能让“QueryAsemblyInfo”检查x64 GAC public bool IsInGac(string assemblyName) { ASSEMBLY_INFO assembyInfo = new ASSEMBLY_INFO(); assembyInfo.cchBuf = 512;

使用下面的代码,我正在查询GAC,以查看它是否安装了特定的程序集。代码本身工作得很好,但我只得到了测试的结果。该组件安装在GACs GAC_64和GAC_32中

我必须做什么才能让“QueryAsemblyInfo”检查x64 GAC

  public bool IsInGac(string assemblyName)
  {
     ASSEMBLY_INFO assembyInfo = new ASSEMBLY_INFO();
     assembyInfo.cchBuf = 512;
     assembyInfo.currentAssemblyPath = new string('\0', assembyInfo.cchBuf);

     IAssemblyCache assemblyCache = null;

     IntPtr hr = NativeMethods.CreateAssemblyCache(out assemblyCache, 0);
     if (hr == IntPtr.Zero)
     {
        hr = assemblyCache.QueryAssemblyInfo(1, assemblyName, ref assembyInfo);
        if (hr != IntPtr.Zero)
        {
           return false;
        }

        return true;
     }

     return false;
  }

  internal static class NativeMethods
  {
     [DllImport("fusion.dll")]
     public static extern IntPtr CreateAssemblyCache(out IAssemblyCache ppAsmCache, int reserved);
  }

  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")]
  internal interface IAssemblyCache
  {
     int Dummy1();
     [PreserveSig]
     IntPtr QueryAssemblyInfo(int flags, [MarshalAs(UnmanagedType.LPWStr)]string assemblyName, ref ASSEMBLY_INFO assemblyInfo);
     int Dummy2();
     int Dummy3();
     int Dummy4();
  }

  [StructLayout(LayoutKind.Sequential)]
  internal struct ASSEMBLY_INFO
  {
     public int cbAssemblyInfo;
     public int assemblyFlags;
     public long assemblySizeInKB;

     [MarshalAs(UnmanagedType.LPWStr)]
     public String currentAssemblyPath;

     public int cchBuf;
  }
此函数的返回类型为HRESULT。这是一个int,而不是C#中的IntPtr。QueryAsemblyInfo()声明中也有同样的内容

当您以任何CPU为目标时,这可能会导致随机故障。除此之外,代码很好,在我的机器上查找GAC_64中的程序集也没有问题

从.NET 1.1开始,所有这些都可以通过程序集获得

var publisher = new System.EnterpriseServices.Internal.Publish();
publisher.GacInstall(@"C:\Temp\MyDLL.dll")


但结果只能得到一个程序集信息。有两个同名的程序集,一个在GAC_32中,一个在GAC_64中。这是QueryAsemblyInfo()不可避免的限制,它只能返回一个结果,不允许按体系结构进行筛选。考虑一下IsCalyNeNUM。好的,这是有道理的。是否有一些如何使用C#的示例?请使用谷歌查找示例。与运行此代码的应用程序类似,它是为x86还是x64构建的?我很好奇它是否会查询与调用它的应用程序相对应的GAC…这是一个普通的.NET应用程序,在x64机器上作为64位进程运行。
var publisher = new System.EnterpriseServices.Internal.Publish();
publisher.GacInstall(@"C:\Temp\MyDLL.dll")
publisher.GacRemove(@"C:\Temp\MyDLL.dll")