13

Chrome や Firefox のように、ユーザー コミュニティからプラグインを受け入れるアプリケーションを開発したいと考えています。これは Web アプリケーションであるため、個々のユーザーのアプリケーションの各「インスタンス」は異なるプラグインを実行します (プラグインはシングルトン インスタンスとして読み込まれますが、特定のユーザーに対してのみ「アクティブ」になります)。私は .NET でアプリケーションを実装することを計画しており、プラグイン モデルのアーキテクチャを考え出そうとしています。

ここに私の望ましい属性があります:

  • プラグインは、個別のアセンブリとして、コア アプリケーションの外部で完全にビルドされます。
  • プラグインは、独自の「ロックダウン」された信頼性の低い環境で実行されます。おそらく別の AppDomain です。
  • プラグインは、私が提供する API を介してのみ機能します。たとえば、ある種のファサードをインターフェイスとして渡すと、それを呼び出すことしかできず、他のアセンブリを呼び出すことはできません。ファイルシステムに影響を与えるなど、Webサーバーで任意にアクションを実行できるプラグインを使用できません。
  • アドインの致命的なクラッシュがコア アプリケーションの安定性に影響を与えることはありません。

System.AddIn が私の最善の策のようですが、ロードされたアドインが私が提供する API を介してのみ機能し、他のアセンブリをロードしないようにする方法については不明です。System.AddIn はその機能を提供しますか? また、System.AddIn は ASP.NET / IIS で使用できますか?

System.Addin 以外にどのようなオプションがありますか?

4

3 に答える 3

5

あなたの主な関心事は分離です(セキュリティと堅牢性のため)。

そのため、ここでの最良のオプションは、別の AppDomain でアドインをアクティブ化することです。このドメイン内で、ロードを許可するアセンブリを制御できます (AppDomainSetup クラスを参照)。

メイン コードは、プラグイン内で発生する不都合なことからも保護されます: すべてのプラグイン メソッドは、コア オブジェクトのコピーで動作する必要があります (渡すオブジェクトが MarshalByRefObject から継承されている場合を除きます。この場合、すべての賭けはオフです)。アドイン メソッドの例外は、すべての呼び出しを try except でラップするか、AppDomain の UnhandledExcption イベントを介して処理できます。

AppDomain の境界を超えると、パフォーマンスが低下することに注意してください。この呼び出しは、基本的にリモート呼び出しです。

もう 1 つの潜在的な問題は、AppDomains の管理方法です。1 つのプロセスで複数の AppDomains を作成しようとしたことはありませんが、ここで問題が発生することが予想されます。複数のユーザー用のアドインを 1 つのドメインに組み合わせると、これに組み込まれようとしている保護に問題が生じます

@RationalGeek の質問への回答 - UnhandledException イベントにより、それが可能になります。このイベントは、コア ドメインとプラグイン ドメインの両方でサブスクライブできますが、この方法で行うには多くの不確実性があります。詳細については、私が参照した記事を参照してください。API へのすべての呼び出しを try/except でラップすることをお勧めします。

于 2013-04-03T20:55:58.550 に答える
1

AppDomains を使用して、未処理の例外を処理できます。appdomain のクラッシュを回避するには、AppDomain.UnhandledExceptionを処理する必要があります。

上記のリンクで、次のステートメントに注意してください

.NET Framework 4 以降では、イベント ハンドラーがセキュリティ クリティカルで、HandleProcessCorruptedStateExceptionsAttribute 属性を持っていない限り、スタック オーバーフローやアクセス違反など、プロセスの状態を破壊する例外に対してこのイベントは発生しません。

そのため、一部の構成を明示的に処理する必要がある場合があります。

未処理の例外が子ドメインの異なるスレッドで発生すると、親ドメインがバブルアップしてダウンするという多くの問題を読みました。その場合は、プラグインごとに appdomain を使用してすべてのプラグインを個別のプロセスにロードするか、プラグインを個別のプロセスにロードすることをお勧めします。

また、SOに関する次の質問に出くわしました。非常に役立つと思います

于 2013-04-10T10:48:51.797 に答える