列出存储在AppDomain中的所有自定义数据

为了在发生错误时存储进程状态,我想列出存储在AppDomain中的所有(自定义)数据(通过SetData)。 LocalStore属性是私有的,AppDomain类不可inheritance。 有没有办法枚举这些数据?

AppDomain domain = AppDomain.CurrentDomain; domain.SetData("testKey", "testValue"); FieldInfo[] fieldInfoArr = domain.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); foreach (FieldInfo fieldInfo in fieldInfoArr) { if (string.Compare(fieldInfo.Name, "_LocalStore", true) != 0) continue; Object value = fieldInfo.GetValue(domain); if (!(value is Dictionary)) return; Dictionary localStore = (Dictionary)value; foreach (var item in localStore) { Object[] values = (Object[])item.Value; foreach (var val in values) { if (val == null) continue; Console.WriteLine(item.Key + " " + val.ToString()); } } } 

基于Frank59的答案,但更简洁:

 var appDomain = AppDomain.CurrentDomain; var flags = BindingFlags.NonPublic | BindingFlags.Instance; var fieldInfo = appDomain.GetType().GetField("_LocalStore", flags); if (fieldInfo == null) return; var localStore = fieldInfo.GetValue(appDomain) as Dictionary; if (localStore == null) return; foreach (var key in localStore.Keys) { var nonNullValues = localStore[key].Where(v => v != null); Console.WriteLine(key + ": " + string.Join(", ", nonNullValues)); } 

相同的解决方案,但作为F#扩展方法。 可能不需要空检查。 https://gist.github.com/ctaggart/30555d3faf94b4d0ff98

 type AppDomain with member x.LocalStore with get() = let f = x.GetType().GetField("_LocalStore", BindingFlags.NonPublic 

BindingFlags.Instance) if f = null then Dictionary() else f.GetValue x :?> Dictionary let printAppDomainObjectCache() = for KeyValue(k,v) in AppDomain.CurrentDomain.LocalStore do printfn “%s” k