4

現在のスレッドの IPrincipal がアプリケーション ドメインの境界を越えて伝播するのを止めることができる人はいますか? スレッドに割り当てられた IPrincipal は制御できませんが、アプリケーション ドメインの作成は制御できます。

(これを行う理由は、プリンシパル オブジェクト型のアセンブリが他のドメインで使用できない場合にシリアル化エラーが発生するのを防ぐためです。)

編集:ExecutionContext.SuppressFlow有望に見えますが、目標を達成していないようです。以下は「MyIdentity」を出力します。

static void Main ()
{
    ExecutionContext.SuppressFlow ();
    Thread.CurrentPrincipal = new GenericPrincipal (new GenericIdentity ("MyIdentity"), "Role".Split ());
    AppDomain.CreateDomain ("New domain").DoCallBack (Isolated);
}

static void Isolated ()
{
    Console.WriteLine ("Current principal: " + Thread.CurrentPrincipal.Identity.Name);  // MyIdentity
}
4

2 に答える 2

5

非同期メソッドを実行しませんでした。ターゲット関数は、同じスレッドによってセカンダリ アプリケーション ドメインで実行されます。だから校長は変わらない。これは機能します:

        var flow = ExecutionContext.SuppressFlow();
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("MyIdentity"), "Role".Split());
        ThreadPool.QueueUserWorkItem((x) => {
            AppDomain.CreateDomain("New domain").DoCallBack(Isolated);
        });
        flow.Undo();

または、特定のコンテキストで同じスレッドを実行したいだけの場合は、ExecutionContext.Run() を使用できます。

        var copy = ExecutionContext.Capture();
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("MyIdentity"), "Role".Split());
        ExecutionContext.Run(copy, new ContextCallback((x) => {
            AppDomain.CreateDomain("New domain").DoCallBack(Isolated);
        }), null);
于 2012-07-15T15:53:08.850 に答える
2

これはあなたが望むことをするようです:

System.Threading.ExecutionContext

具体的には、SuppressFlowメソッドを見てください。

クリス

于 2012-07-15T05:58:01.537 に答える