2012-05-02 16 views
1

C#でスレッド(特にスレッドから作成されたスレッド)の特定のアクセス許可を制御することはできますか?スレッドの作成を制限する

新しいスレッドが作成され、特定のユーザー指定のコードが実行されるC#アプリケーションを開発しています。

ユーザーコードがCANで実行できない操作を制御するにはどうすればよいですか?これは可能ですか?

特に、私は特定のAPIへのアクセスを使用コードから制限したいと思います。

特定の例として、ユーザーコードから新しいスレッドを生成する機能を無効にしたいということです。

*この理由は、ユーザーコードアプリケーション全体のクラッシュにつながる、例外自体を処理できません新しいスレッドをオフに産卵するということです。

+1

これは複雑なトピックであり、特に何を制限したいかによって異なります。 .NET Frameworkには、リソースへのアクセスを制御するさまざまな方法があります。もっと詳しく説明できますか? – JamieSee

+0

詳細情報で更新しました。 –

答えて

0

「プラグイン」からアプリケーションを保護する1つの方法は、別のAppDomainを使用してそれをホストすることです。しかし、主に断熱材が参照のマーシャリングを必要とするため、これは容易ではありません。別のAppDomainのインスタンスを直接参照することはできません。これにより、断熱材が破損するため、.NETは洗練されたプロキシモデルをサポートします。この点の欠点は、すべてのコードがこのプロキシを念頭に置いて作成されなければならず、プロキシされた参照オブジェクトがMarshalByRefObjectから派生し、非プロキシオブジェクトすべてがコピーによってリモート境界を越えるシリアル化をサポートしなければならないということです。このすべてには当然のことながら、パフォーマンスが低下します。しかし、この作業を済ませたら、アプリケーション全体を停止せずにAppDomainを「クラッシュ」させることができるようになりました。メインアプリケーションでも例外が処理されます(マーシャリングされた参照呼び出しは、

次のステップは、外部ホスティングプロセスを作成し、外部コードとやりとりするための何らかの形式のプロセス間通信を使用することです。これにより、優れた独立性が得られます(AppDomainのバグのない管理されていないコードはアプリ全体をダウンさせる可能性があります)

+0

実際には、ユーザーコードは主なアプリケーションドメインではなく、セカンダリアプリドメインで実行されます。しかし、これはクラッシュを停止するようではありません。 –

+1

@liortal、詳細については、[この回答](http://stackoverflow.com/questions/6520850/can-unhandled-exceptions-in-child-appdomains-be-prevented-from-crashing-the-main)を参照してください。明らかに私は間違っていた。スレッド例外はまだアプリ全体をダウンさせるでしょう。プロセス外のホスティングが最適なオプションです。 –

2

トレッドの作成に追加の権限は必要ないため、.Netのスレッドの作成をブロックする方法はありません。

また、ユーザーのコードが別のスレッドを生成する方法は複数あります。

敵対的な外部アセンブリを実行することを目標としているのであれば、スレッド作成以外のものから保護する必要があります。つまり、StackOverflowExceptionはスローして新しいスレッドを作成せずにプロセスを停止させるのが簡単です。

+0

これらの「プラグイン」アセンブリを寄付する開発者は敵対的ではありませんが、例外を適切に処理できないとMYアプリケーションがクラッシュする可能性があります。実行されるコードはtry..catchブロックで囲まれていますが、新しく作成されたスレッドはそれによって処理されず、アプリケーションがクラッシュします。 –

+0

この場合、コード以外のソリューション(プラグインの作成に関するガイダンス+アプリをクラッシュさせたことが判明したプラグイン+開発者がアプリケーションにやさしい方法でコードを書く手助け)は安くなる可能性があります。すべての興味深いケース(ブロッキング、クラッシュ、高CPU、新しいスレッド/接続/ファイル/ ...)を処理するアプリケーションを強化することは**難しい**です。 –

0

なぜこのコードを試してみませんか?

Application.ThreadException + = OnHandledException;あなたの懸念が未処理の例外についてであれば

プライベート静的ボイドOnHandledException(オブジェクト送信者、ThreadExceptionEventArgs E)

{ は//ここ を処理}。そのスニペットはトリックを行うことができます。

関連する問題