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

Windows 窗体应用程序和控件可以与非托管应用程序进行互操作,但有一些注意事项。 以下部分介绍 Windows 窗体应用程序和控件支持的方案和配置,以及它们不支持的方案和配置。

Windows 窗体控件和 ActiveX 应用程序

除 Microsoft Internet Explorer 和 Microsoft Foundation Classes(MFC)外,Windows 窗体控件在设计为托管 ActiveX 控件的应用程序中不受支持。 在能够托管 ActiveX 控件的其他应用程序和开发工具(包括早于 Visual Studio .NET 2003 的 Visual Studio 版本中的 ActiveX 测试容器)中也不支持托管 Windows 窗体控件。

这些约束同样适用于通过组件对象模型(COM)互操作来使用 Windows 窗体控件。 只在 Internet Explorer 中支持通过 COM 可调用包装器 (CCW) 来使用 Windows 窗体控件。 有关 COM 互操作的详细信息,请参阅

COM Interop

下表显示了对 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++ 互操作功能。 建议使用C++互操作功能。

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 窗体消息循环上运行它。 为此,请使用以下方法之一:

另请参阅