この質問は、以下の質問に非常に似ていますが、鉱山は、もう少し正確で、プラスどちらも受け入れ答えを持っていたし、提供する回答のどれも完全または最適思えません:
元々、私は以下の方法が最善のアプローチだと思っていましたが、アセンブリの完全な名前を指定しないとうまくいきませんでした。それはtry/catchのハックビーコンです多くの場合のために働く:
public static class GacUtil
{
public static bool IsAssemblyInGAC(string assemblyFullName)
{
try
{
return Assembly.ReflectionOnlyLoad(assemblyFullName)
.GlobalAssemblyCache;
}
catch
{
return false;
}
}
public static bool IsAssemblyInGAC(Assembly assembly)
{
return assembly.GlobalAssemblyCache;
}
}
これはFusion APIを使用してのtry/catchせずに動作するより良いアプローチです。それはたくさんより多くのコードだが、それは部分的なアセンブリ名を使用して動作します:コードベースがnullの場合
public static class GacUtil
{
[DllImport("fusion.dll")]
private static extern IntPtr CreateAssemblyCache(
out IAssemblyCache ppAsmCache,
int reserved);
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")]
private interface IAssemblyCache
{
int Dummy1();
[PreserveSig()]
IntPtr QueryAssemblyInfo(
int flags,
[MarshalAs(UnmanagedType.LPWStr)] string assemblyName,
ref AssemblyInfo assemblyInfo);
int Dummy2();
int Dummy3();
int Dummy4();
}
[StructLayout(LayoutKind.Sequential)]
private struct AssemblyInfo
{
public int cbAssemblyInfo;
public int assemblyFlags;
public long assemblySizeInKB;
[MarshalAs(UnmanagedType.LPWStr)]
public string currentAssemblyPath;
public int cchBuf;
}
public static bool IsAssemblyInGAC(string assemblyName)
{
var assembyInfo = new AssemblyInfo { cchBuf = 512 };
assembyInfo.currentAssemblyPath = new string('\0', assembyInfo.cchBuf);
IAssemblyCache assemblyCache;
var hr = CreateAssemblyCache(out assemblyCache, 0);
if (hr == IntPtr.Zero)
{
hr = assemblyCache.QueryAssemblyInfo(
1,
assemblyName,
ref assembyInfo);
if (hr != IntPtr.Zero)
{
return false;
}
return true;
}
Marshal.ThrowExceptionForHR(hr.ToInt32());
return false;
}
}
可能重複http://stackoverflow.com/質問/ 1933947/gac-for-an-assembly) – JMK
融合API [IAssemblyCache.QueryAssemblyInfo](http://stackoverflow.com/a/2611435/17034)を使用してください。 –
@Hans私はおそらく完全に管理されたソリューションを望んでいるはずですが、あなたが正しいと思っているはずですが、Fusion APIは私の望むことをやっています。完全に管理されたソリューションのためにやったことについて私の答えを見てください。 –