2012-07-13 14 views
6

私はLINQPadを使ってコードをテストしていますが、これはThread.CurrentPrincipalをマークされたカスタムIPrincipalに設定しようとすると例外が発生します私はLINQPad(言語としてC#プログラム)でこのコードを実行すると、私はSerializableの属性のすべてを削除した場合linqpadとカスタム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"); 
     } 
    } 
} 

は、私は次の例外

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

を取得し、問題を示すサンプル以下SerializableAttribute とうまくいく。これは、LINQPadが使用するAppDomainアーキテクチャと、MyCustomPrincipalを定義するアセンブリをフレームワークが見つけることができないことに関連する問題です。 また、MyCustomPrincipalを別のアセンブリに定義してGACに組み込むことで問題は解決しますが、それは私の選択肢ではありません。 誰でもアイデアはありますか?

おかげで、 マルコ

EDIT:それは助けることができれば、私は知りませんが、私はSqlDependency.Startと同じ問題を抱えていました:IPrincipalにシリアライズを置くと、エラーをスローするためのフレームワークを作りました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; 
} 
+5

これはLINQPadの問題のように見えるん。私はそれをより詳細に調べて返信します。 –

+0

@JoeAlbahariこの更新情報はありますか?それは本当に迷惑で、私は回避策が見つからなかった – mCasamento

+0

私はここで答えを見つけたと思った:http://stackoverflow.com/questions/11489673/preventing-thread-currentprincipal-from-propagating-across-application-domains、クロスドメインコールは両側から開始されるため、LINQPadでは機能しません。 LINQPadには、ホストとワーカーのドメイン間には*たくさんの通信があります。これには十数以上の方法があります。これは単なる呼び出しをハッキングする問題ではありません。 –

答えて

0

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

gacutil -i nameofassembly.dll

+0

あなたの答えをありがとう、私はすでにそれを試して、それは動作します。私はそれが実際の解決策を回避するより多くのものだと考えていますが、何よりも優れています。それにもかかわらず、私はこれを答えとしています。 – mCasamento

0

暗いところで刺すが、交差するアセンブリによって署名することはできますか?

+0

かもしれませんが、メモリ内にのみ存在するアセンブリにどのように署名できますか?それはLINQPadの内部で行う必要がありますか? – mCasamento

0

これはLinqPadのシリアル化の問題のようです。 Linqpadの作成者Joseph Albahariがあなたのコメントでこれを確認したのを見ています。

結論:LinqPadの修正が必要です。私は周りの仕事を知らない。

関連する問題