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 フォーム メッセージ ループで実行する必要があります。この場合、次のいずれかの方法を使用します。
Form.ShowDialog メソッドを使って、Windows フォームを表示する。詳細については、「方法 : ShowDialog メソッドで Windows フォームを表示して COM 相互運用機能をサポートする」を参照してください。
各 Windows フォームを新しいスレッドに表示する。詳細については、「方法 : 独自のスレッドで各 Windows フォームを表示して COM 相互運用機能をサポートする」を参照してください。
共有メッセージ ループを .NET Framework コンポーネントの新しいスレッドに作成する。詳細については、「方法 : 共有スレッド上に Windows フォームを表示することで COM 相互運用をサポートする」を参照してください。
参照
処理手順
方法 : ShowDialog メソッドで Windows フォームを表示して COM 相互運用機能をサポートする
方法 : 独自のスレッドで各 Windows フォームを表示して COM 相互運用機能をサポートする
方法 : 共有スレッド上に Windows フォームを表示することで COM 相互運用をサポートする
概念
COM への .NET Framework コンポーネントの公開
参照
Windows フォーム ActiveX コントロール インポータ (Aximp.exe)