2013-10-01 77 views
0

我們在我們的系統中開始使用MATLAB 64位,並且我們的一些傳統M代碼使用定製版本的MSFlexGrid ActiveX組件,因此我們決定編寫.Net 64位版本的它。在64位中使用64位.Net ActiveX控件MATLAB

該ActiveX通過Windows窗體主機公開。

[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調用.Net--在MATLAB過程中。該調用在.Net中成功執行,但當控制從.Net返回時,MATLAB進程凍結。運行相同的代碼而不實例化ActiveX控件會成功,並且MATLAB不會凍結,這意味着實例化.Net ActiveX控件可能是MATLAB凍結的原因。

在搜索解決方案時,我遇到了this MSDN thread,其中聲明:「出現此問題的原因是Windows窗體使用的消息循環和COM客戶機應用程序提供的消息循環不同。原始的海報得出結論,他解決了WPF + MFC的問題,但沒有詳細解決方案。

我還發現this MSDN article其中指出:「從一個COM客戶端應用程序正確地作出一個Windows窗體的工作,你必須運行在Windows窗體窗體消息循環。」除了解決方案專注於創建新的Windows窗體窗口,我還需要運行嵌入MATLAB窗口中的Windows窗體用戶控件,這也很有希望。

所以這個問題似乎與託管託管在一個非託管的應用程序的ActiveX控件 - 任何想法?

回答

0

不是一個真正的「解決方案」,以您的問題,但也許一(恕我直言好)替代的ActiveX的東西:

一些MATLAB版本開始(我覺得〜2009左右,別人可能會糾正我,如果不)你可以直接從MATLAB使用.NET庫,而不需要COM接口: http://www.mathworks.de/de/help/matlab/getting-started.html

語法方面,你可以使用.NET類幾乎和Java類一樣好。 特別是,這應該比通過MEX與.NET交談更舒服 - 我假設。

+0

感謝您的建議。我同意它可以比調用.Net更好的MEX,我會將它轉發給我們團隊的負責人,但是,我假設實際將任何用戶控件嵌入到MATLAB窗口中,我仍然需要ActiveX控件。 – Andrey

+0

猜測你說得對 - 這似乎沒有類似於.NET對象的「actxcontrol」的功能......(還) – sebastian