我們在我們的系統中開始使用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控件 - 任何想法?
感謝您的建議。我同意它可以比調用.Net更好的MEX,我會將它轉發給我們團隊的負責人,但是,我假設實際將任何用戶控件嵌入到MATLAB窗口中,我仍然需要ActiveX控件。 – Andrey
猜測你說得對 - 這似乎沒有類似於.NET對象的「actxcontrol」的功能......(還) – sebastian