4

PermissionSetDLRが正しく機能するために必要な必須項目は何ですか?

サンドボックススクリプト環境でDLRを有効にしました。しかし、次のようないくつかのコード...

dynamic foo = someobject
foo.FooBar();

...次のように、かなりあいまいで「未完成」のように見える例外がスローされるだけです。

System.Security.SecurityException: Request failed.
   at CallSite.Target(Closure , CallSite , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1[T0](CallSite site, T0 arg0)
   at AcmeCorp.AcmeRocket.Workflow.Scripting.Assemblies.WorkflowScriptImplementation.Test()
   at AcmeCorp.AcmeRocket.Workflow.Scripting.Assemblies.WorkflowScriptImplementation.__action_activity_4397110c5d7141a6802a070d3b942b77()
   --- End of inner exception stack trace ---
   at AcmeCorp.AcmeRocket.Workflow.Scripting.WorkflowScriptProxy.Invoke(String method_name)
   at AcmeCorp.AcmeRocket.Workflow.Execution.Executors.ActionActivityExecutor.Execute(WorkflowInstance wi, ActionActivity activity)
   at AcmeCorp.AcmeRocket.Workflow.Execution.ActivityExecutorBase.Execute(WorkflowInstance wi, Activity activity)
   at AcmeCorp.AcmeRocket.Workflow.Execution.WorkflowExecutor.ExecuteActivity(WorkflowInstance wi, Activity activity)
   at AcmeCorp.AcmeRocket.Workflow.Execution.WorkflowExecutor.Execute(WorkflowInstance wi, Nullable`1 branch_index)

通常SecurityException、には、失敗の原因となった権限を正確に指定する詳細のホストが含まれていますが、この場合、それは得られません-非常に面倒です。

PS:サンドボックスを一時的に許可して同じテストを実行するとPermissionSet(PermissionState.Unrestricted)、問題は解決します。しかし、明らかに、DLRが必要とする非常に特定の権限のセットにロックダウンしたいと考えています。

PPS:現在の(失敗した)PermissionSetは次のように作成されます。

var ps = new PermissionSet(PermissionState.None);
ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
ps.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));

ありがとう。

4

1 に答える 1

2

より詳細なセキュリティ例外が発生しない理由は、CAS権限が制限されているコンテキストで読み取られているためです。完全に信頼できるコンテキストでToStringメソッドを呼び出すと、完全な例外の詳細を読み取ることができます。

とはいえ、単純なサンドボックス化されたAppDomainシナリオでは同じ問題を再現できないため、例外が本当にDLRの使用によるものかどうか疑問に思います。同じ権限セットの下で強く型付けされたターゲットインスタンスで同じメソッドを呼び出そうとするとどうなりますか?

たとえば、呼び出されたメソッドに無制限のアクセス許可セットに対するLinkDemandがある場合、同様の例外を再現できます。この問題は、動的変数または強く型付けされた変数に対する呼び出しに関係なく、呼び出しスタックが異なっていても見られます。

于 2011-04-13T12:58:15.790 に答える