1

私は現在、MAFを使用して、制限されたAppDomain(インターネット許可)にアドインが読み込まれるアドインモデルを作成しました。これは、アドインの作成者がデータベースに対して直接クエリを実行しないようにするため、ほとんどの場合、アドインがデータベースを呼び出せないことを意味します。

特定のタスクを実行できるようにする何らかの形式のホストAPIを使用するようにします(たとえば、非常に特定のクエリを実行したり、電子メールを送信したりします)。誰かがこれを行うための最良の方法を教えてもらえますか?

制限された方法でアドインを実行しているときに、ホストAPIを含むアセンブリを完全な信頼アセンブリとして扱うようにAppDomainを設定しようとしましたが、db接続を開こうとするとSecurityExceptionsが発生します。

4

1 に答える 1

1

OK、なんとかこれを解決できました。知る必要がある人のために:

  1. ホストAPIを含むアセンブリを作成し、アドインがそれを参照できるようにします。

  2. ホストAPIを含むアセンブリで、アセンブリレベルで[AllowPartiallyTrustedCallers]属性がオンになっていることを確認し、アセンブリに厳密な名前を付けます。

  3. ホストAPIアセンブリが完全な信頼アセンブリとしてAppDomainに登録されていることを確認します(これを行う方法については、リンクを参照してください)。

  4. エスカレーションされた権限を必要とするホストAPIのメソッドが、[SecuritySafeCritical]属性(.NET 4)で装飾されていることを確認します。

  5. エスカレーションされた権限が必要な各メソッドの開始時に完全な信頼を要求し、その直後に要求を削除します。以下のコードは、完全に信頼して実行されるデリゲートを取得するメソッドを提供します。

    /// <summary>
    /// Runs the supplied delegate using full trust
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="func"></param>
    /// <returns></returns>
    private static T RunWithFullTrust<T>(Func<T> func)
    {
        //NOTE: This line grants the method full trust
        new PermissionSet(PermissionState.Unrestricted).Assert();
    
        T result = func();
    
        //Undo the grant for full-trust!
        CodeAccessPermission.RevertAssert();
    
        return result;
    }
    

また、アドインをロードする前に、ホストAPIが制限されたAppDomainにロードされていることを確認してください。これにより、ホストAPIアセンブリが見つからない場合の例外を回避できます。

于 2010-11-10T23:31:37.570 に答える