3

次のコードでは、GAC にクエリを実行して、特定のアセンブリがインストールされているかどうかを確認しています。コード自体は正常に動作しますが、 x86 GACの結果しか得られません。アセンブリは、GAC GAC_64 と GAC_32 の両方にインストールされます。

「QueryAssemblyInfo」が 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;
  }
4

2 に答える 2

2
    [DllImport("fusion.dll")]
    public static extern IntPtr CreateAssemblyCache(...)

この関数の戻りタイプはHRESULTです。これはintであり、C#のIntPtrではありません。QueryAssemblyInfo()宣言についても同じです。

これにより、AnyCPUをターゲットにしたときにランダムな障害が発生する可能性があります。それ以外は、コードは問題なく、私のマシンのGAC_64でアセンブリを見つけるのに問題はありません。

ここに画像の説明を入力してください

于 2012-08-28T11:40:52.363 に答える