从 C# 调用函数时出现 Matlab 异常(MWMCR::EvaluateFunction 错误)

Matlab exception (MWMCR::EvaluateFunction error) when call function from C#

当我从 C# class 调用 matlab 函数时,我遇到了一个奇怪的问题。大多数时间一切正常,但有时(例如 100 次呼叫中的 1 次呼叫,可能是 1000 次或一天中的一次呼叫 - 我可以在未来测量它)我收到一个奇怪的 MWMCR 错误。当然,错误会导致我的 C# 代码出现异常。两台计算机上的行为相同。

异常消息总是如下所示 ... MWMCR::EvaluateFunction error ... The file "C:\Users\user\AppData\Local\Temp\VF\mcrCache9.2\Matlab1\Program Files\MATLAB\R2012b\work\frm\file_with_called_function.m" cannot be executed..

异常的详细信息是 Failed to open file 'C:\Users\user\AppData\Local\Temp\VF\mcrCache9.2\Matlab1\Program Files\MATLAB\R2012b\work\frm\file_with_called_function.m'. Details: 'File stream is closed. The following flags are set: failbit.'

并且mscorelib错误 mscorlib::Void HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage)

(我当然有整个调用栈,但是好像用处不大。)

如您所见,我使用的是 MWMCR v 9.2。 (MATLAB 9.2,R2017a 版)和 MWMCR 在用户的临时目录中工作。有趣的是,当我在错误后浏览目录时,目录为空。我不知道这是正常行为。

还有问题。为什么MWMCR有时打不开文件(评价功能)??相关的问题是为什么(在我的例子中)failbit on the stream set 和为什么 filestream closed??

和子问题。 MWMCR 如何与用户的 tmp 文件夹一起使用? MWMCR 将 matlab 文件复制到临时目录,使用它们并删除它们??为什么目录是空的??

谢谢。

解决方案是使用环境变量 MCR_CACHE_ROOT 将默认缓存位置更改为您可以控制的位置(如项目目录、用户目录等)。

说明。

运行时间可能没有设计成运行长的时间。它使用存储脚本的标准临时位置(tmp 目录),OS 一段时间后删除它时找不到它。此外 运行time 使用 LRU 缓存之类的东西,这意味着一些文件在内存缓存中查找,一些文件在文件系统缓存中查找。

当你总是使用内存缓存中的文件时,即使目录缓存是空的,一切都很好。但是当你填充内存缓存并且你想使用新函数时 运行time 尝试从文件系统缓存加载它。当文件系统缓存已被删除时,将发生错误。

在我的例子中,每月一次(取决于计算类型)。