Windows フォームおよびアンマネージ アプリケーションの概要

更新 : 2007 年 11 月

Windows フォーム アプリケーションおよび Windows フォーム コントロールは、いくつかの点を注意することで、アンマネージ アプリケーションと相互運用できます。次のセクションでは、Windows フォーム アプリケーションおよび Windows フォーム コントロールがサポートするシナリオと構成、およびサポートしないシナリオと構成について説明します。

Windows フォーム コントロールおよび ActiveX アプリケーション

Windows フォーム コントロールは、Microsoft Internet Explorer および MFC (Microsoft Foundation Class) を除いて、ActiveX コントロールをホストするようにデザインされているアプリケーションでサポートされません。Visual Studio .NET 2003 より以前のバージョンの Visual Studio に含まれている ActiveX テスト コンテナを含めて、ActiveX コントロールをホストできる他のアプリケーションおよび開発ツールは、Windows フォーム コントロールのホストとしてサポートされていません。

この制約は、コンポーネント オブジェクト モデルの COM 相互運用を通じて Windows フォーム コントロールを使用する場合にも適用されます。COM 呼び出し可能ラッパー (CCW) を通じて Windows フォーム コントロールを使用することは、Internet Explorer でのみサポートされます。COM 相互運用の詳細については、以下を参照してください。

COM 相互運用 型および 高度な COM 相互運用性 型。

次の表は、Windows フォーム コントロールに対して有効な ActiveX ホスト サポートを示しています。

Windows フォームのバージョン

[サポート]

.NET Framework Version 1.0

Internet Explorer 5.01 以降

.NET Framework Version 1.1 以降

Internet Explorer 5.01 以降

MFC (Microsoft Foundation Class) 7.0 以降

Windows フォーム コンポーネントを ActiveX コントロールとしてホストする

.NET Framework 1.1 では、MFC 7.0 以降のバージョンにまで、サポートの範囲が広げられました。このサポートは、MFC 7.0 以降の ActiveX コントロール コンテナと完全に互換性があるすべてのコンテナが対象です。

ただし、Windows フォーム コントロールを ActiveX コントロールとして登録することはサポートされていません。また、Windows フォーム コントロールに対して com.ms.win32.Ole32.CoCreateInstance メソッドを呼び出すこともサポートされていません。Windows フォーム コントロールのマネージ アクティベーションだけがサポートされています。Windows フォーム コントロールを作成すると、それを ActiveX コントロールのように MFC アプリケーション内でホストできます。

アンマネージ アプリケーション内で Windows フォーム コントロールを使用するには、アンマネージ CLR ホスト API を使って CLR をホストするか、C++ 相互運用機能を使用する必要があります。C++ 相互運用機能を使用する方法の方が推奨されます。

COM クライアント アプリケーション内の Windows フォーム

Visual Basic 6.0 アプリケーションや MFC アプリケーションなど、COM クライアント アプリケーションから Windows フォームを開くと、フォームが予期しない動作をすることがあります。たとえば、Tab キーを押しても、あるコントロールから別のコントロールに、フォーカスが変更しません。コマンド ボタンにフォーカスがあるときに Enter キーを押しても、ボタンの Click イベントが発生しません。キーストロークやマウスの動作でも、予期しない状態が発生することがあります。

この動作が発生するのは、Windows フォームにとっては正しく動作することが必要なメッセージ ループ サポートを、アンマネージ アプリケーションが実装していないことが原因です。COM クライアント アプリケーションによって提供されるメッセージ ループと Windows フォームのメッセージ ループは、根本的に異なります。

アプリケーションのメッセージ ループは内部プログラムループで、スレッドのメッセージ キューからメッセージを取得して変換し、それを、処理されるアプリケーションに対して送信します。Windows フォームのメッセージ ループは、Visual Basic 6.0 アプリケーションや MFC アプリケーションなど、以前のアプリケーションが備えているメッセージ ループとは、アーキテクチャが異なります。メッセージ ループにポストされるウィンドウ メッセージは、Windows フォームが予期する方法とは異なる方法で処理される可能性があります。そのため、予期しない動作が発生することがあります。キーストロークの組み合わせが動作しなかったり、マウスが動作しなかったり、イベントが予期するように発生しなかったりします。

相互運用の問題の解決

これらの問題は、フォームを .NET Framework メッセージ ループに表示することで解決できます。このメッセージ ループは、Application.Run メソッドを使って作成します。

COM クライアント アプリケーションから Windows フォームを正しく動作させるには、フォームを Windows フォーム メッセージ ループで実行する必要があります。この場合、次のいずれかの方法を使用します。

参照

処理手順

方法 : ShowDialog メソッドで Windows フォームを表示して COM 相互運用機能をサポートする

方法 : 独自のスレッドで各 Windows フォームを表示して COM 相互運用機能をサポートする

方法 : 共有スレッド上に Windows フォームを表示することで COM 相互運用をサポートする

概念

COM への .NET Framework コンポーネントの公開

COM 用のアセンブリのパッケージ化

COM へのアセンブリの登録

参照

Windows フォーム ActiveX コントロール インポータ (Aximp.exe)

その他の技術情報

Windows フォームとアンマネージ アプリケーション

COM 相互運用

高度な COM 相互運用性

.NET Framework アプリケーションにおける COM 相互運用性

COM の相互運用性に関するサンプル