我们在系统中开始使用MATLAB 64位,我们的一些遗留M代码使用MSFlexGrid ActiveX组件的自定义版本,因此我们决定编写.Net 64位版本。
ActiveX通过Windows窗体主机公开。
[ProgId("FlexiGrid")]
[Guid("88888888-4444-4444-4444-CCCCCCCCCCCC")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class GridWinFormsHost : UserControl
{
}
Windows窗体用户控件通过ElementHost嵌入WPF UserControl。
private IGrid grid;
private void GridWinFormsHostLoad(object sender, System.EventArgs e)
{
var host = new ElementHost { Dock = DockStyle.Fill };
this.grid = new GridView();
host.Child = (GridView)this.grid;
this.Controls.Add(host);
}
控件已成功注册,可在MATLAB中看到,并可通过
实例化actxcontrol('FlexiGrid', Position, Fig, CallBack);
GridWinForms中公开的方法和属性是可见的,可以进行get / set / invoked。
然而,在实例化ActiveX之后,我们最终需要通过MEX DLL调用.Net - 在MATLAB过程中。调用在.Net中成功执行,但当控制从.Net返回时,MATLAB进程冻结。在不实例化ActiveX控件的情况下运行相同的代码成功并且MATLAB不会冻结,这意味着实例化.Net ActiveX控件可能是导致MATLAB冻结的原因。
在搜索解决方案时,我遇到了this MSDN thread,其中声明:“出现此问题是因为Windows窗体使用的消息循环和COM客户端应用程序提供的消息循环不同。 “原始海报的结论是他用WPF + MFC解决了这个问题,但没有详细说明解决方案。
我还发现this MSDN article表明:“要使Windows窗体从COM客户端应用程序正常工作,必须在Windows窗体消息循环上运行该窗体。”这除了解决方案专注于创建新的Windows窗体窗口,但我需要运行嵌入在MATLAB窗口中的Windows窗体用户控件之外,这也很有前景。
所以问题似乎与在非托管应用程序上托管托管ActiveX控件有关 - 任何想法?
答案 0 :(得分:0)
对你的问题不是一个真正的“解决方案”,但也许是一个(imho好)替代activeX的东西:
从一些MATLAB版本开始(我认为~2009左右,其他人可能会纠正我,如果没有)你可以直接从MATLAB使用.NET库,而不需要COM接口: http://www.mathworks.de/de/help/matlab/getting-started.html
语法方面,您可以使用几乎与java类一样好的.NET类。 特别是,这应该比通过MEX与.NET交谈要舒服得多 - 我认为。