6

LINQPadを使用してコードをテストしています(素晴らしい製品です、言わなければなりません)が、Thread.CurrentPrincipalを、デモのサンプルに続いてSerializableAttributeでマークされたカスタムIPrincipalに設定しようとすると、例外が発生します。問題

void Main()
{
    Thread.CurrentPrincipal = new MyCustomPrincipal();
}

// Define other methods and classes here
[Serializable]
public class MyCustomPrincipal : IPrincipal
{
    public bool IsInRole(string role)
    {
        return true;
    }

    public IIdentity Identity 
    { 
        get
        {
            return new WindowsIdentity("RECUPERA\\m.casamento");
        }
    }
}

このコードをLINQPad(言語としてのC#プログラム)で実行すると、次の例外が発生します

Type is not resolved for member 'UserQuery+MyCustomPrincipal,query_nhxfev, Version=0.0.0.0, 
Culture=neutral, PublicKeyToken=null' 
RuntimeMethodInfo: PluginWindowManager.get_Form ()

Serializable属性を削除すると、すべてうまくいきます。LINQPadが使用するAppDomainアーキテクチャと、フレームワークがMyCustomPrincipalを定義するアセンブリを見つけることができないことに関連する問題のようです。また、MyCustomPrincipalを別のアセンブリに定義し、それをGACに配置することで問題が解決すると思いますが、それは私にとっての選択肢ではありません。誰かアイデアがありますか?

ありがとう、マルコ

編集:それが役立つかどうかはわかりませんが、SqlDependency.Startで同じ問題が発生しました:IPrincipalにSerializableを配置すると、フレームワークが次のタイプを定義するアセンブリが見つからないというエラーをスローしましたIPrincipal。私は不名誉なハックで解決しました:

System.Security.Principal.IPrincipal principal;
principal = System.Threading.Thread.CurrentPrincipal;

System.Threading.Thread.CurrentPrincipal = null;
try
{
    SqlDependency.Start(connectionString);
        m_SqlDependencyStarted = true;
}
catch (Exception ex)
{
    throw (ex);
}
finally
{
    System.Threading.Thread.CurrentPrincipal = principal;
}
4

3 に答える 3

0

暗闇の中で刺しますが、アセンブリが交差しているため、署名する可能性がありますか?

于 2012-08-14T17:47:29.463 に答える
0

これは、LinqPad内のシリアル化の問題のようです。Linqpadの作成者であるJosephAlbahariがあなたのコメントでこれを確認したようです。

結論:これを行うには、LinqPadで修正が必要です。回避策はわかりません。

于 2012-08-30T19:26:41.030 に答える
0

使用できるトリックの1つは、カスタムプリンシパルを含むアセンブリに厳密な名前を付け、それをグローバルアセンブリキャッシュに配置することです。そうすれば、どのアプリケーションでも必要なアセンブリを見つけることができますが、後で再度削除する必要があるため、理想的なソリューションではありません。とにかく、Visual Studioがインストールされている場合にGACにインストールするには、VSコマンドプロンプトを実行して、次を実行します。

gacutil -i nameofassembly.dll

于 2012-12-31T10:39:47.807 に答える