이 질문은 다음 질문에 대한 매우 유사하지만, 내 좀 더 정확 플러스도는 허용 대답을했다 및 제공에 대한 답변 중 어느 것도 완전하거나 최적 같았다 :
원래 다음과 같은 것이 최선의 방법이라고 생각했지만 어셈블리의 전체 이름을 지정하지 않으면 try/catch의 해커 beacause와 비슷하지만 간단합니다 많은 경우에 작동합니다
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를 사용하여 시도/캐치없이 작동하는 더 나은 방법입니다. 그것은 무리 많은 코드입니다하지만이 부분 조립 이름으로 작동합니다 코드베이스가 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가 내가 원하는 것을 할 수 있다고 명시해야했습니다. 완벽하게 관리되는 솔루션을 위해 무엇을했는지에 대한 내 대답을보십시오. –