部分信頼シナリオで F# コードを使用した経験のある人はいますか? [<AllowPartiallyTrustedCallers>]
同様に、 ?を使用してアセンブリを作成します。
私は、部分信頼で実行できるようにする必要があるいくつかのプロジェクトに取り組んでおり、レベル 2 セキュリティ ルール ( http://msdn.microsoft.com/en-us/library/dd233102. aspx )。自己完結型アセンブリの実際には、これは簡単です。属性を入力するだけです。ただし、アセンブリが、注釈が付けられておらず、「SecurityCritical」と想定されていないサードパーティの DLL を参照する場合があります。ここが「面白い」ところです。
過去数日間使用した結果、F# には深刻な問題があるようです。.NET セキュリティ ポリシーでは、"SecurityCritical" コードを参照または呼び出す場合に型/メソッドに注釈を付けることを期待して[<SecuritySafeCritical>]
います。これは、たまたま NuGet にあるほとんどのコードであり、これが既定値であるためです。これで、F# では、クロージャーを使い始めるまで問題なく動作します。次のことはできません。
namespace Foo
open System.Security
[<assembly: AllowPartiallyTrustedCallers>]
[<assembly: SecurityRules(SecurityRuleSet.Level2)>]
do()
[<SecurityCritical>]
module C =
let get () = [ 1 .. 10 ]
[<SecuritySafeCritical>]
module M =
let foo () =
seq {
for i in 1 .. 10 do
yield!
C.get ()
|> Seq.filter (fun x -> x % 2 = 0)
}
このアセンブリはSecAnnotate.exe
チェックに合格しません。これは、F# コンパイラがクロージャを別の型にリフトするためです。これは、現在は で注釈が付けられていません[<SecuritySafeCritical>]
。デフォルトは透明ですが、エラーであるいくつかの重要なコードを参照しています。
小さな制限のように聞こえますが、コードを変更してクロージャーを回避し、SecAnnotate の制約を満たすには、何時間もかかりました。たぶん、F# はセキュリティ属性をそれが作成するクロージャー型に伝播できるでしょうか? 私が見逃している別の簡単な方法はありますか?