簡體   English   中英

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

[英]Using a 64bit .Net ActiveX control in 64bit MATLAB

我們開始在系統中使用MATLAB 64位,並且我們的某些舊版M代碼使用MSFlexGrid ActiveX組件的自定義版本,因此我們決定為其編寫.Net 64位版本。

ActiveX通過Windows Forms主機公開。

[ProgId("FlexiGrid")]
[Guid("88888888-4444-4444-4444-CCCCCCCCCCCC")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class GridWinFormsHost : UserControl
{
}

Windows窗體用戶控件通過ElementHost嵌入WPF用戶控件。

    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中公開的方法和屬性是可見的,可以獲取/設置/調用。

但是,在實例化ActiveX之后,我們最終需要通過MEX DLL在MATLAB過程中調用.Net。 調用在.Net中成功執行,但是當控件從.Net返回時,MATLAB進程凍結。 在不實例化ActiveX控件的情況下運行相同的代碼成功,並且MATLAB不會凍結,這意味着實例化.Net ActiveX控件可能是MATLAB凍結的原因。

在搜索解決方案時,我遇到了一個MSDN線程 ,其中指出: “發生此問題的原因是Windows窗體使用的消息循環和COM客戶端應用程序提供的消息循環是不同的。” 原始海報得出的結論是,他使用WPF + MFC解決了該問題,但未詳細說明解決方案。

我還發現該MSDN文章指出: “要使Windows窗體從COM客戶端應用程序正常工作,必須在Windows窗體消息循環上運行該窗體。” 除了解決方案着重於創建新的Windows Form窗口外,這還很有希望,但是我需要運行MATLAB窗口中嵌入的Windows Forms用戶控件。

因此,問題似乎與在非托管應用程序上托管托管ActiveX控件有關-有什么想法嗎?

這不是解決問題的真正“解決方案”,但可能是ActiveX的替代方案(imho好):

從某些MATLAB版本開始(我認為大約是2009年,如果沒有,其他版本可能會糾正我),您可以直接從MATLAB使用.NET庫,而無需COM接口: http : //www.mathworks.de/de /help/matlab/getting-started.html

在語法方面,您可以使用幾乎與Java類一樣好的.NET類。 特別是,這應該比通過MEX與.NET進行交談要舒服得多-我認為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM