如何在不重启MATLAB的情况下重新编译模型DLL?

5
我正在开发一个Simulink中的SFunction和编译后子模型,该SFunction调用使用Realtime Workshop编译的DLL。问题在于,一旦我编译了子模型一次,通过SFunction在本机Simulink中执行并完成模型后,MATLAB仍然保持着对子模型DLL的控制权。除非重新启动MATLAB,否则我无法重新编译DLL以释放其控制权。我已经试图使用ProcessExplorer来强制关闭句柄,但它无法做到这一点。

你尝试关闭模型了吗?这样做有什么区别吗?另外,在关闭模型后,你尝试过使用 clear functions 吗?它应该会清除内存中的所有 MEX 函数。 - am304
3
曾尝试过以下操作:(1) 清空<model_name>,(2) 清空mex,(3) 清空所有内容,(4) 关闭所有模型,(5) 卸载<dll_name>库,(6) 关闭模型,(7) 关闭所有模型;(8) 使用SysInternals ProcessExplorer关闭句柄,(9) 使用Unlocker解锁/删除DLL文件,以及(10) 在SFunction结尾处调用FreeLibrary()函数。但这些都似乎没有影响到问题的解决。 - J Collins
1
你如何加载/调用你的dll?在mdlTerminate函数完成后,你是否卸载它? - Navan
@Florian,它返回零。 - J Collins
@Navan 我在 DLL 上调用了 FreeLibrary()。第一次尝试时,它导致了分段错误,不过现在我已经有了一些有限的成功。 - J Collins
显示剩余3条评论
2个回答

2

我认为,如果你只是将实际的DLL重命名并重新编译,它应该可以工作。我知道这对于mex文件有效。如果这不起作用,你可以尝试这个解决方案


重命名被Windows禁止,因为MATLAB.exe对其具有DLL句柄。 - J Collins

2

如何将S-Function绑定到DLL?如果您在链接时绑定,那么可以尝试在运行时进行动态绑定并在mdlTerminate中显式释放句柄。这样,MATLAB甚至不会知道您访问了DLL。当然,这使得从S-Function内部与DLL的实际交互有些混乱。


到目前为止,我得出的答案是使用LoadLibrary()和FreeLibrary()分别在mdlStart和mdlTerminate上调用。第一次尝试使用它时,导致了段错误,所以有点紧张,但自那以后它已经有些工作了。 - J Collins
@JCollins:只需确保通过将DLL句柄存储在工作向量中(而不是使用全局变量)使您的S-Function可重入。然后你就没问题了。 - Florian Brucker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接