Visual Basic を使用して開発されたコンポーネントなどのシングルスレッド アパートメント (STA) COM コンポーネントを ASP.NET ページから使用する場合は、互換性属性AspCompat=trueを
<%@ Page>
ASP.NET ページのタグ
AspCompat 属性は、ページを強制的に STA モードで実行します。
ASP.NET はデフォルトで MTA (マルチスレッド アパートメント) スレッドを使用します。
VB6 または Visual FoxPro (MTDLL) で作成されたものなど、古い学校の COM オブジェクトとやり取りする ASP.NET アプリケーションを構築する場合、要求を処理するスレッドがシングル スレッド アパートメント スレッドを使用することが非常に重要です。STA は、基本的にシングル スレッド コンポーネントがマルチスレッド環境で確実に動作できるようにする COM 組み込みテクノロジです。STA は、特定のスレッドでインスタンス化された COM オブジェクトがその特定のスレッドにとどまり、別のスレッドから COM オブジェクトにアクセスすると、そのスレッドを STA スレッドに自動的にマーシャリングすることを保証します。最終的な結果として、複数のスレッドを持つことができますが、COM オブジェクト インスタンスは変更されない固定スレッド上に存在します。
ASP.NET は既定で、MTA (マルチスレッド アパートメント) スレッドを使用します。これは、COM オブジェクトのマーシャリングに注意を払わない、真に自由に回転するスレッドです。これは、特定のスレッドでコードを実行してもよいかどうか、または何らかのスレッド/COM マーシャリングが必要かどうかを判断する際に少しオーバーヘッドがある STA スレッド化よりもはるかに効率的です。MTA COM コンポーネントは非常に効率的ですが、マルチスレッド環境の STA COM コンポーネントは常にかなりの量のオーバーヘッドを持つ傾向があります。
ASP.NET の STA
Support for STA threading in the ASP.NET framework is fairly limited.
Specifically only the original ASP.NET WebForms technology supports
STA threading directly via its STA Page Handler implementation or what
you might know as ASPCOMPAT mode. For WebForms running STA components
is as easy as specifying the ASPCOMPAT attribute in the @Page tag:
<%@ Page Language="C#" AspCompat="true" %>
which runs the page in STA mode. Removing it runs in MTA mode. Simple.
STA for non supporting ASP.NET Technologies
only WebForms supports STA natively
- ASP.NET HttpHandlers
- ASMX Web Services
- ASP.NET MVC
- WCF Web Services
- ASP.NET Web API
STA components are a pain in the ass. I feel your pain :-)
Good reference:
https://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications#STAfornonsupportingASP.NETTechnologies