在matlab中卸载一个dll

时间:2014-08-10 08:23:22

标签: c# matlab dll serial-port

我正在使用我之前创建的.net DLL作为串行设备(可编程MCU)和MATLAB之间的接口: 示例操作: 1. MATLAB通过DLL向串口发送'开放端口'请求, 2.端口在DLL中打开,MATLAB无法控制端口(只有DLL有), 3. MATLAB向DLL发送其他请求(如读,写等...),并相应地做出响应 4. MATLAB通过DLL向串口发送'关闭端口'请求, 5.端口已关闭但仍由DLL占用。

问题是因为DLL在MATLAB中并且无法卸载(MATLAB,如MATHWORKS网站所述,不支持卸载已加载的.net DLL)并且MATLAB无法直接控制端口,端口在MATLAB关闭且DLL被卸载之前不可用(仅在MATLAB关闭时才会发生)。这意味着用户需要关闭几次MATLAB ......

那么,他们是否有任何解决方法来卸载DLL?或任何其他解决方案?

P.S,MATLAB有一些串行功能,但它们的性能非常有限(例如数据采集),因此无法使用它们(同样,DAQ-Toolbox也不错,但成本很高)。

1 个答案:

答案 0 :(得分:1)

端口已关闭但仍然被DLL 占用,这是实际问题,应该可以解决:.Net串口api不允许的根本不可能你要正确关闭一个端口。所有System.IO.Ports.SerialPort类都有Close method之后应该完全关闭端口。

无论如何,可能的解决方案包括:

  • 在程序集中公开COM并在matlab中使用actxserver,它具有卸载功能
  • 将.Net lib包装在dll中,仅显示纯C函数并使用matlab的loadlibrary / unloadlibrary
  • 不要用C#编写,而是使用C并像上面一样使用它
  • 问题是否真的出现在.Net串口处理中:不要使用.Net SerialPort,而是使用DllImport来使用可以直接处理串口的windows api函数(CreateFile等等);那么,这可能就是.Net SerialPort类内部做的......