我在寻找一种方式嵌入Windows窗体在C#编写的C ++ Windows应用程序的应用程序。 本机应用程序的主窗口被分成几个窗格。 的C#应用程序被认为那些窗格中的一个内出现,即,C#组分(最外面的形式)的根窗口必须在主应用程序的一个子窗口。
可以这样做? 如果是这样,怎么样?
一些额外的背景:据我所知,有两种方式来进行此事。 首先,通过使用.NET托管的API(ICLRRuntimeHost等)主办的本机应用程序的CLR。 其次,通过将Windows窗体中的ActiveX控件主办的CLR。
关于第一种方法,我设法让CLR启动和(在很大程度上要归功于加载一个C#组件马蒂亚斯Högström )。 当我打一个路障的是,我看不到出路如何告诉我的,因为它必须从C ++侧通过在一个窗口的孩子CLR运行的组件。
我也尝试用第二个方法(使用ActiveX和感谢丹尼尔Yanovsky )。 它几乎,但只差一点,适合我的目的。 我可以让任意Windows窗体的本机应用程序的一个子窗格中运行的组件。 但他们总是在主应用程序的主线程上运行。 这意味着他们所使用的主要的应用程序的窗口消息循环。 MSDN说,这不会因为标准的Windows消息循环可靠的工作不符合Windows窗体的要求(我想后的链接MSDN这里,但已经用完了我的新用户,双连杆行使超额配股权)。
该消息循环问题,唯一的例外是,根据MSDN,Internet Explorer和MFC应用程序。 我使用的是一台主机的本机应用程序绝对不是Internet Explorer。 此外,它使用Windows API作为包裹由wxWidgets的所以MFC不是(或至少不是一个欢迎)选项。
该解决方案的微软提出了包括让自己的信息运行C#组件自己的线程循环。 这至少据我所知,必然导致回到上面提到的第一种方法。 所以我回得到一个Windows窗体一个传入的父窗口下工作的问题。
同样,我感兴趣的是明确的子窗口的问题,独立的我在这里提到的方法中的任何输入。 但根据上下文我可以在一般问题减小到两个具体问题(我需要一个答案,只是其中之一):
- 鉴于一个ActiveX控件中承载Windows窗体,我怎么能允许的形式在自己的消息循环在自己的线程上运行?
要么
- 鉴于Windows窗体中的本机应用程序托管的CLR运行时,如何才能让表格是窗口的子窗口中的本机应用程序?