8

エラーが発生したときのプロセスの状態を保存するために、(SetData によって) AppDomain に保存されているすべての (カスタム) データを一覧表示したいと考えています。LocalStore プロパティはプライベートであり、AppDomain クラスは継承できません。これらのデータを列挙する方法はありますか?

4

3 に答える 3

7
        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<string,object[]>))
                return;
            Dictionary<string, object[]> localStore = (Dictionary<string, object[]>)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());
                }
            }


        }
于 2012-12-07T15:41:36.530 に答える
3

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<string, object[]>;
if (localStore == null)
    return;
foreach (var key in localStore.Keys)
{
    var nonNullValues = localStore[key].Where(v => v != null);
    Console.WriteLine(key + ": " + string.Join(", ", nonNullValues));
}
于 2013-03-07T17:35:40.717 に答える