在64位MATLAB中使用64位.Net ActiveX控件

时间:2013-10-01 11:23:43

标签: c# .net matlab 64-bit activex

我们在系统中开始使用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控件有关 - 任何想法?

1 个答案:

答案 0 :(得分:0)

对你的问题不是一个真正的“解决方案”,但也许是一个(imho好)替代activeX的东西:

从一些MATLAB版本开始(我认为~2009左右,其他人可能会纠正我,如果没有)你可以直接从MATLAB使用.NET库,而不需要COM接口: http://www.mathworks.de/de/help/matlab/getting-started.html

语法方面,您可以使用几乎与java类一样好的.NET类。 特别是,这应该比通过MEX与.NET交谈要舒服得多 - 我认为。