2016-11-18 6 views
2

MTAスレッドコンテキスト(.Net WebApi要求)から呼び出すことができるSTAリモートアプリケーションタイプライブラリ(スレッドモデルとアパートメントの観点から)をC#のランタイム呼び出し可能ラッパーで保護しますか?WebApiからSTA COMオブジェクトを呼び出す

サーバーSTAアプリケーションをMTAに変更する必要がありますか、RCWがこれらのメカニズムをバックグラウンドで処理する必要がありますか?

答えて

1

RCWはCOMプロキシの.NETプロキシです。 .NETアプリケーションでどのアパートメントを使用しているかは関係ありません。RCWはマーシャリングを処理します。

オブジェクトがリモートであるため、アパートメントに互換性があり、通信がプロセスを横断することを心配する必要はありません。 C++などのネイティブ言語と環境を使用する場合は、アパートメント全体でCOMプロキシを共有しない、つまり各アパートメントのプロキシ参照を適切にマーシャリングすることを心配するだけで済みます。

オブジェクトがインプロセスの場合、同じアパートメントを共有するパフォーマンスが向上しますが、プロセス間でマーシャリングとスレッドスケジューリングの遅延が最大のオーバーヘッドになります。

ただし、他のアプリケーションで使用するアパートメントを検討する必要があります。 STAを使用するアプリケーションはシングルスレッドになるため、ASP.NETアプリケーションのボトルネックになります。 MTAを使用している場合は、おそらくそうではなく、すべての呼び出しを同期しない場合や、クリティカルセクションが高速である場合。

アプリケーションの場合、通常、使用されているアパートメントを制御することはできません。どのようにアパートを改築しますか?これはCOM +コンポーネントですか?これはあなたのコードですか?それはアパートのスイッチのために準備ができていますか?

+0

基本的に私はフリースレッドに変更し、コードの重要な領域でいくつかのロックを適用します。しかし、このIPCメカニズムは、アプリケーションの他の機能と比較してほとんど使用されないため、パフォーマンスは問題にはなりません。私はそれをそのまま残すと思う。 – EProgrammerNotFound

+0

RCWのクラスコンストラクタで問題が発生しましたが、type_e_cantloadlibraryが断続的に発生し、out-of-procサーバの解決が終了しましたが、これは本番環境の品質ソリューションではありません。したがって、疑問。 – EProgrammerNotFound

+1

私はアウトプロセスサーバー(EXE、代理を使用しているDLL)の代わりにインプロセスサーバー(DLL)について話していると思います。レジストリで簡単に実行されるインプロセスサーバーの登録済みアパートメントを変更しますが、サーバーはその種類のアパートメントをサポートする必要があります。 Out-of-Processサーバー(サロゲートを使用しない)で使用されるアパートメントを変更すると、通常、コードを変更するか、アプリケーション固有の設定を使用することになります。 – acelent

関連する問題