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

Posted

技术标签:

【中文标题】从 C# 调用函数时的 Matlab 异常(MWMCR::EvaluateFunction 错误)【英文标题】:Matlab exception (MWMCR::EvaluateFunction error) when call function from C# 【发布时间】:2018-07-13 07:19:25 【问题描述】:

当我从 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有时无法打开文件(评估功能)?相关的问题是为什么(在我的情况下)failbit 在设置的流上以及为什么文件流关闭??

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

谢谢。

【问题讨论】:

这很可能是由于防病毒。如果有,请将扫描配置为忽略 mcr 缓存文件夹。 我认为这将是“防病毒问题”,但在第二台机器(不是我的带有 Eset 的个人计算机)上不是防病毒软件。至少没有任何特殊的防病毒软件(只有来自 M$ 的默认应用程序,如防御者等)。会不会是问题? 几点观察:a) 为什么 MCR 目录包含来自 R2012b 的文件,b) c# 中的周围代码是做什么的? c)您从 matlab 调用中获取什么数据?另外,我强烈建议您联系 Mathworks 的官方技术支持来解决这个问题。 @PrateekKhandelwal a)我认为这并不重要,但它与编译器版本有关——也许我们使用了错误的版本 b)C# 代码只准备数据,调用 matlab 函数进行计算(例如,从像阶乘这样的小公式到像核素衰减这样的复杂计算)并解析结果 c)在这种情况下抛出异常,但通常是从 b)计算的结果 - 从一个数字到结构的复杂数据结构的数组。 (如果我没有解决问题,我稍后会联系官方 MW 支持。) 【参考方案1】:

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

解释。

运行时可能不是为长时间运行而设计的。它使用标准临时位置(tmp 目录)来存储脚本,并且当操作系统在一段时间后删除它时找不到它。此外,运行时使用 LRU 缓存之类的东西,这意味着一些文件在内存缓存中查找,而另一些在文件系统缓存中查找。

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

就我而言,每月一次(取决于计算类型)。

【讨论】:

以上是关于从 C# 调用函数时的 Matlab 异常(MWMCR::EvaluateFunction 错误)的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 应用程序内部调用 Matlab 编译器会引发异常

C# WPF WebBrowser控件调用Refresh()函数出现异常,导致程序“未响应”并无法继续运行

C#调用matlab时,类型初始值设定项引发异常

C#如何调用JS文件中的函数

在从 C# 调用的 Matlab 函数中保存状态

编译后的 Matlab 函数只工作一次