2013-12-18 125 views
5

我正在开发Simulink中的SFunction和编译子模型,这是一个调用使用Realtime Workshop编译的DLL的SFunction。问题是,一旦我编译子模型一次,通过SFunction和模型完成在本地Simulink中执行它,MATLAB仍然保持子模型DLL的句柄。我不能重新编译DLL,直到MATLAB重新启动,强制释放DLL。如何在不重新启动MATLAB的情况下重新编译模型DLL?

我甚至看到ProcessExplorer是否可以强制关闭句柄,但它不能。

+0

您是否试过关闭模型?这有什么不同吗?另外,关闭模型后,您是否尝试过'清除函数?它应该从内存中清除所有MEX功能。 – am304

+3

已尝试: (1)清除,(2)清除mex,(3)清除所有,(4)bdclose全部,(5)卸载库(),(6)关闭模型,(7)关闭所有楷模; (8)使用SysInternals ProcessExplorer关闭句柄; (9)使用Unlocker解锁/删除DLL;(10)在SFunction的末尾调用FreeLibrary()。这些似乎都不影响这个问题。 –

+0

:-(不止我会尝试...对不起,没有任何其他想法 – am304

回答

2

如何将S函数绑定到DLL?如果你在链接时绑定,那么你可以尝试bind at runtime并明确释放mdlTerminate中的句柄。这样,MATLAB应该永远不会知道你访问过DLL。当然,这使得S函数内与DLL的实际交互更加混乱。

+0

这和我的答案差不多到目前为止,使用LoadLibrary()和FreeLibrary()分别在mdlStart和mdlTerminate上调用。第一次尝试使用它会导致分割违规,所以有点紧张,但从那时起它已经有所作为。 –

+0

@JCollins:只要确保通过在工作向量中存储DLL句柄(而不是使用全局变量)来保持S函数可重入。那你应该没问题。 –

2

我认为它会工作,如果你只是将实际的DLL重命名为其他东西,然后重新编译。我知道它适用于mex文件。如果这不起作用,你可以试试这个solution

+0

Windows不允许重命名,因为MATLAB.exe有一个DLL处理它 –

+0

清除mex 解决了我的问题。谢谢。 –

相关问题