Windows 窗体和非托管应用程序概述

Windows 窗体应用程序和控件可以与非托管应用程序交互操作,但是会显示某些警告。 以下各节描述了 Windows 窗体应用程序和控件支持和不支持的方案和配置。

Windows 窗体控件和 ActiveX 应用程序

由于存在 Microsoft Internet Explorer 和 Microsoft 基础类 (MFC) 的异常,因此,在为了承载 ActiveX 控件而设计的应用程序中不支持 Windows 窗体控件。 在能够承载 ActiveX 控件的其他应用程序和开发工具(包括早于 Visual Studio .NET 2003 的 Visual Studio 版本中的 ActiveX 测试容器)中也不支持使用 Windows 窗体控件。

这些约束还适用于通过组件对象模型 COM 互操作 来使用 Windows 窗体控件的情况。 只在 Internet Explorer 中支持通过 COM 可调用包装程序 (CCW) 来使用 Windows 窗体控件。 有关 COM 互操作 的更多信息,请参见:

COM 互操作 (Visual Basic)高级 COM 互操作性

下表显示了对 Windows 窗体控件的可用 ActiveX 承载支持。

Windows 窗体版本

支持

.NET Framework 版本 1.0

Internet Explorer 5.01 和更高版本

.NET Framework 版本 1.1 和更高版本

Internet Explorer 5.01 和更高版本

Microsoft 基础类 (MFC) 7.0 和更高版本

作为 ActiveX 控件承载 Windows 窗体组件

在 .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++ Interop 功能。 使用 C++ Interop 功能是建议采用的解决方案。

COM 客户端应用程序中的 Windows 窗体

从 COM 客户端应用程序(例如,Visual Basic 6.0 应用程序或 MFC 应用程序)打开 Windows 窗体时,窗体可能出现意外行为。 例如,当您按 Tab 键时,焦点无法从一个控件切换到另一个控件。 或者当您在命令按钮有焦点的情况下按 Enter 键时,无法引发按钮的 Click 事件。 还可能遇到按键或鼠标操作的其他意外行为。

发生此行为是因为非托管应用程序没有实现消息循环支持,而 Windows 窗体需要该支持才能正确工作。 COM 客户端应用程序所提供的消息循环根本不同于 Windows 窗体消息循环。

应用程序的消息循环是内部程序循环,它从线程的消息队列检索消息,然后转换这些消息,之后将它们发送给要处理的应用程序。 Windows 窗体的消息循环与更早的应用程序(例如,Visual Basic 6.0 应用程序和 MFC 应用程序)所提供的消息循环的体系结构不同。 发布到消息循环的窗口消息的处理方式可能与 Windows 窗体期望的不同。 因此,可能发生意外的行为。 某些按键组合可能不工作,某些鼠标活动可能不工作,或者某些事件可能不会按期望引发。

解决互操作性问题

可以通过在 .NET Framework 消息循环(它是使用 Application.Run 方法创建的)基础上显示窗体来解决这些问题。

若要使 Windows 窗体在 COM 客户端应用程序中正确工作,必须在 Windows 窗体消息循环上运行该窗体。 为此,请执行下列方法之一:

请参见

任务

如何:通过使用 ShowDialog 方法显示 Windows 窗体来支持 COM 互操作

如何:通过在每个 Windows 窗体各自的线程上显示该 Windows 窗体来支持 COM 互操作

参考

Aximp.exe(Windows 窗体 ActiveX 控件导入程序)

概念

向 COM 公开 .NET Framework 组件

将 COM 的程序集打包

向 COM 注册程序集

其他资源

Windows 窗体和非托管应用程序

COM 互操作 (Visual Basic)

高级 COM 互操作性

.NET Framework 应用程序中的 COM 互操作性 (Visual Basic)

COM Interoperability Samples