c# - 从 C# 调用函数时的 Matlab 异常(MWMCR::EvaluateFunction 错误)
问题描述
当我从 C# 类调用 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有时无法打开文件(评估功能)?相关的问题是为什么(在我的情况下)流设置上的故障位以及为什么文件流关闭?
和子问题。MWMCR 如何与用户的 tmp 文件夹一起工作?MWMCR 将 matlab 文件复制到 temp 目录,与它们一起使用并删除它们??为什么目录是空的??
谢谢你。
解决方案
解决方案是使用 env 变量MCR_CACHE_ROOT
将默认缓存位置更改为您控制的位置(如项目目录、用户目录等)。
解释。
运行时可能不是为长时间运行而设计的。它使用标准临时位置(tmp 目录)来存储脚本,并且当操作系统在一段时间后删除它时找不到它。此外,运行时使用 LRU 缓存之类的东西,这意味着一些文件在内存缓存中查找,而一些文件在文件系统缓存中查找。
当您总是使用内存缓存中的文件时,即使目录缓存为空,一切都可以。但是当你填充内存缓存并且你想使用新的函数运行时尝试从文件系统缓存中加载它。当文件系统缓存被删除时,将发生错误。
就我而言,每月一次(取决于计算类型)。