// (c) 2006 Richard Grimes // www.grimes.demon.co.uk using System; using System.Collections; using System.Reflection; using System.Runtime.InteropServices; class App { static void Main(string[] args) { string file = RuntimeEnvironment.GetRuntimeDirectory() + "mscorcfg.dll"; Assembly assem = Assembly.LoadFile(file); Type type = assem.GetType("Microsoft.CLRAdmin.Fusion"); uint flag = 2; if (args.Length > 0) { switch (args[0].ToLower()) { case "zap": flag = 1; break; case "gac": flag = 2; break; case "download": flag = 4; break; } } MethodInfo mi = type.GetMethod("ReadCache", BindingFlags.NonPublic|BindingFlags.Static); ArrayList assems = new ArrayList(); mi.Invoke(null, new object[]{assems, flag}); foreach (object o in assems) { AssemInfo a = new AssemInfo(o); Console.WriteLine(a.sFusionName); } } } class AssemInfo { public string Name=null; public string Version=null; public string Locale=null; public string PublicKey=null; public string PublicKeyToken=null; public string Modified=null; public string Codebase=null; public string ProcType=null; public string OSType=null; public string OSVersion=null; public uint nCacheType=0; public string sCustom=null; public string sFusionName=null; public AssemInfo(object o) { SetString(o, "Name"); SetString(o, "Version"); SetString(o, "Locale"); SetString(o, "PublicKey"); SetString(o, "PublicKeyToken"); SetString(o, "Modified"); SetString(o, "Codebase"); SetString(o, "ProcType"); SetString(o, "OSType"); SetString(o, "OSVersion"); SetString(o, "sCustom"); SetString(o, "sFusionName"); FieldInfo src = o.GetType().GetField("nCacheType", BindingFlags.NonPublic|BindingFlags.Instance); nCacheType = (uint)src.GetValue(o); } private void SetString(object o, string name) { FieldInfo src = o.GetType().GetField(name, BindingFlags.NonPublic|BindingFlags.Instance); FieldInfo dst = this.GetType().GetField(name); dst.SetValue(this, src.GetValue(o)); } }