Share via


COM コンポーネントの互換性

ほとんどの COM コンポーネントは ASP.NET で動作します。ASP (Active Server Pages) の以前のバージョンと同様に、CreateObject 関数 (Visual Basic) を使用してコンポーネントに対して遅延バインディングを呼び出すことができます。詳細については、「.NET Framework アプリケーションにおける COM 相互運用性」を参照してください。

このトピックは、次の内容で構成されています。

  • 事前バインディング

  • 64 ビットのコンポーネント

事前バインディング

コンポーネントに対する遅延バインディングもサポートされていますが、パフォーマンスの観点からは、事前バインディングの使用が推奨されます。.NET Framework SDK に含まれている タイプ ライブラリ インポータ (Tlbimp.exe) という名前のツールは、.dll ファイル内の標準 COM コンポーネントの周囲にマネージ ラッパーを作成して、そのコンポーネントを同等の .NET Framework アセンブリに変換します。変換したコンポーネントは、マネージ コードに事前バインディングして、パフォーマンスを大幅に向上させることができます。Tlbimp.exe の詳細については、「.NET Framework への COM コンポーネントの公開」を参照してください。COM コンポーネントのマネージ コードへの変換については、「相互運用性を得るための COM コンポーネントの作成」を参照してください。

COM コンポーネントが .NET Framework アセンブリに変換された後に、ASP.NET ページの先頭にディレクティブを配置することによって、そのページに対してそのアセンブリをインポートできるようになります。たとえば、次のディレクティブは、Tlbimp.exe によって作成された名前空間 MyNewNamespace をインポートします。

<%@Import Namespace="MyNewNamespace"%>

Tlbimp.exe によって生成したアセンブリ ファイルは、ASP.NET アプリケーションの Bin ディレクトリに入れる必要があります。元の COM コンポーネント ファイルは、そのファイルが常駐しているディレクトリに対して登録される必要があります。

たとえば、Visual Basic を使って作成されたコンポーネントのようなシングルスレッド アパートメント (STA: Single-Threaded Apartment) COM コンポーネントを ASP.NET ページから使用する場合は、次の例に示すように、互換性属性 AspCompat=true を ASP.NET ページ上の <%@ Page > タグに記述する必要があります。

<%@Page AspCompat=true Language = VB%>

AspCompat 属性は、ページを強制的に STA モードで実行させます。互換タグが省略されるとランタイムは例外をスローし、STA コンポーネントがページ上で参照されます。Tlbimp.exe を使用して STA コンポーネントをアセンブリに変換する場合、ランタイムはそのコンポーネントが STA モデルを使用することを検出せず、例外をスローしませんが、アプリケーションのパフォーマンスが大幅に低下する可能性があります。

重要

構築時に作成された COM コンポーネントは、要求が STA スレッド プールに対してスケジュールされる前に実行されるため、マルチスレッド アパートメント (MTA: Multithreaded Apartment) スレッドで実行されます。この場合は、パフォーマンスが大幅に低下するので、回避する必要があります。STA コンポーネントと共に AspCompat を使用する場合は、Page_Load イベントから、つまりページの構築時ではなく、後の実行チェインでのみ、COM コンポーネントを作成してください。

たとえば、次のようなメンバ宣言は構築時にコンポーネントを作成します。

<%@ Page AspCompat="true" Language="C#" %>

<script runat="server">
    // The components is created at construction time.
    MyComObject comObj = new MyComObject();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        // The object is first used here.
        comObj.DoSomething();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>
<%@ Page AspCompat="true" Language="VB" %>

<script runat="server">
    ' The components is created at construction time.
    Dim comObj As MyComObject = New MyComObject()
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        ' The object is first used here.
        comObj.DoSomething()
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

代わりに、次のようなコードを使用します。

<%@ Page AspCompat="true" Language="C#" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        // The component is created and used after the code is running 
        // on the STA thread pool.
        MyComObject comObj = new MyComObject();
        comObj.DoSomething();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>
<%@ Page AspCompat="true" Language="VB" %>

<script runat="server">
    ' The component is created and used after the code is running 
    ' on the STA thread pool.
    Dim comObj As MyComObject = New MyComObject()
    comObj.DoSomething()
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

64 ビットのコンポーネント

Microsoft Windows の 64 ビット バージョンでは、WOW64 エミュレータを使用して 32 ビットのアプリケーションを実行できます。ただし、プロセスは 32 ビットまたは 64 ビットのいずれかだけです。両方を実行するプロセスを実行することはできません。

インターネット インフォメーション サービス (IIS) は、Windows の 64 ビット バージョンで 64 ビットのアプリケーションとして実行されます。COM コンポーネントのプロセス型は、IIS ワーカー プロセス型に合わせる必要があります。次のいずれかのソリューションを使用すると、32 ビットのコンポーネントを IIS の 64 ビット バージョンで実行できます。

  • Dllhost.exe で実行できるように、COM コンポーネントを COM+ アプリケーションとして構成します。

  • 32 ビットのアプリケーションを実行できるように IIS を構成します。このオプションは、IIS サーバーのすべてのアプリケーションに影響します。詳細については、IIS Deployment Guide の「Appendix D: Running 32-bit Applications on 64-bit Windows (IIS 6.0)」を参照してください。

コンポーネントを 64 ビットに変換することをお勧めします。Visual Basic コンポーネントの場合は、64 ビット バージョンの Visual Basic コンパイラがないため、64 ビットに変換することはできません。

参照

処理手順

方法 : ASP.NET の既存の MTS コンポーネントのアクセス許可を更新する

概念

.NET Framework への COM コンポーネントの公開
相互運用性を得るための COM コンポーネントの作成
ASP.NET Web サイト内の共有コード フォルダ