private static unsafe string GetLocation(ASM_CACHE gacId) { const int ERROR_INSUFFICIENT_BUFFER = unchecked((int)0x8007007A); int characterCount = 0; int hr = GetCachePath(gacId, null, ref characterCount); if (hr != ERROR_INSUFFICIENT_BUFFER) { throw Marshal.GetExceptionForHR(hr); } byte[] data = new byte[(characterCount + 1) * 2]; fixed (byte* p = data) { hr = GetCachePath(gacId, p, ref characterCount); if (hr != 0) { throw Marshal.GetExceptionForHR(hr); } return Marshal.PtrToStringUni((IntPtr)p); } }
private static unsafe extern int GetCachePath(ASM_CACHE id, byte* path, ref int length);
private static extern int CreateAssemblyEnum(out IAssemblyEnum ppEnum, FusionAssemblyIdentity.IApplicationContext pAppCtx, FusionAssemblyIdentity.IAssemblyName pName, ASM_CACHE dwFlags, IntPtr pvReserved);
private static extern int CreateAssemblyEnum(out IAssemblyEnum ppEnum, FusionAssemblyIdentity.IApplicationContext pAppCtx, FusionAssemblyIdentity.IAssemblyName pName, ASM_CACHE dwFlags, IntPtr pvReserved);
private static unsafe extern int GetCachePath(ASM_CACHE id, byte *path, ref int length);