Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在64位MATLAB中使用64位.Net ActiveX控件_C#_.net_Matlab_64 Bit_Activex - Fatal编程技术网

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

C# 在64位MATLAB中使用64位.Net ActiveX控件,c#,.net,matlab,64-bit,activex,C#,.net,Matlab,64 Bit,Activex,我们开始在系统中使用MATLAB 64位,一些遗留M代码使用ActiveX组件的自定义版本,因此我们决定编写.Net 64位版本 ActiveX通过Windows窗体主机公开 [ProgId(“FlexiGrid”)] [Guid(“8888888-4444-4444-4444-CCCC”)] [ClassInterface(ClassInterfaceType.AutoDual)] [ComVisible(true)] 公共部分类GridWinFormsHost:UserControl { }

我们开始在系统中使用MATLAB 64位,一些遗留M代码使用ActiveX组件的自定义版本,因此我们决定编写.Net 64位版本

ActiveX通过Windows窗体主机公开

[ProgId(“FlexiGrid”)]
[Guid(“8888888-4444-4444-4444-CCCC”)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
公共部分类GridWinFormsHost:UserControl
{
}
Windows窗体用户控件通过ElementHost嵌入WPF UserControl

专用IGrid网格;
私有void GridWinFormsHostLoad(对象发送方,System.EventArgs e)
{
var host=newelementhost{Dock=DockStyle.Fill};
this.grid=new GridView();
host.Child=(GridView)this.grid;
this.Controls.Add(主机);
}
该控件已成功注册,对MATLAB可见,并可通过

actxcontrol('FlexiGrid', Position, Fig, CallBack);
GridWinForms中公开的方法和属性是可见的,可以获取/设置/调用

然而,在实例化ActiveX之后,我们最终需要通过MEX DLL调用.Net(在MATLAB过程中)。调用在.Net中成功执行,但当控件从.Net返回时,MATLAB进程冻结。在不实例化ActiveX控件的情况下运行相同的代码会成功,而MATLAB不会冻结,这意味着实例化.Net ActiveX控件可能是导致MATLAB冻结的原因

在搜索解决方案时,我遇到了这样一个问题:“出现这个问题是因为Windows窗体使用的消息循环和COM客户端应用程序提供的消息循环不同。”原始海报得出结论,他用WPF+MFC解决了这个问题,但没有详细说明解决方案

我还发现,其中指出:“要使Windows窗体从COM客户端应用程序正常工作,必须在Windows窗体消息循环上运行窗体。”这也很有希望,只是解决方案侧重于创建新的Windows窗体窗口,但我需要运行嵌入在MATLAB窗口中的Windows窗体用户控件

因此,问题似乎与在非托管应用程序上托管托管托管ActiveX控件有关-有什么想法吗?

不是解决问题的真正“解决方案”,但可能是ActiveX的一个(很好的)替代方案:

从某些MATLAB版本开始(我认为~2009年左右,其他人可能会纠正我,如果不是),您可以直接从MATLAB使用.NET库,而无需COM接口:

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

谢谢你的建议。我同意调用.Net可能比MEX更好,但我会将其转发给我们团队中负责此工作的人员,我假设要在MATLAB窗口中嵌入任何用户控件,我仍然需要一个ActiveX控件。我想你是对的-对于.NET对象,似乎没有类似于“actxcontrol”的函数…(尚未)