从 C# 应用程序内部调用 Matlab 编译器会引发异常
Posted
技术标签:
【中文标题】从 C# 应用程序内部调用 Matlab 编译器会引发异常【英文标题】:Calling Matlab Compiler from inside C# app throws exception 【发布时间】:2013-03-29 21:10:07 【问题描述】:我发现这段代码可以调用 Matlab 编译器,当从 Matlab 命令提示符调用该函数时它可以正常工作,我将此函数构建到 .Net Assembly 但每当我尝试在我的 C# 应用程序中使用它以构建一些.m 文件出现异常,您认为我的问题出在哪里?
Matlab 代码:
function compileCode(mfile,dllName , dnetdir)
%% Create directories if needed
if (exist(dnetdir, 'dir') ~= 7)
mkdir(dnetdir);
end
%% Build .NET Assembly
eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:' dllName ',' ...
'' dllName ',0.0,private'' -T link:lib ''' mfile '''']);
end
C#代码:
var cmm = new compiler.MatlabCompiler();
MWCharArray x = new MWCharArray(@"C:\Users\ePezhman\Documents\MATLAB\Graph2D.m");
MWCharArray y = new MWCharArray("Graph");
MWCharArray z = new MWCharArray(@"C:\Matlab\dotnet");
cmm.compileCode(x,y,z);
例外:
... MWMCR::EvaluateFunction 错误 ... 未定义函数 'mcc' for 'char' 类型的输入参数。 => compileCode.m 第 9 行出错。
... Matlab M 代码堆栈跟踪... 在文件 C:\Users\ePezhman\AppData\Local\Temp\ePezhman\mcrCache8.0\compil0\compiler\compileCode.m, 名称 compileCode,第 9 行。
【问题讨论】:
直接从 C# 调用命令会容易得多。使用Process.Start()
。
【参考方案1】:
有趣的是,我假设您正在尝试编译一个可以动态编译其他函数的函数..
不幸的是,我不认为mcc
函数可以自己编译/部署
确切地说,您看到的问题是因为 MATLAB 需要知道在编译时调用的所有函数,并且通过使用 eval
,它不会自行解决(因为它不会在字符串中解析) .您可以通过为编译器编写 special comments 来解决此特定问题..
function myEval()
%#function foo
eval('...');
end
(另一种选择是使用function handles)。
即使你这样做,它也会在运行时在 mcc
函数内失败,说:"License checkout failed, [...] Cannot find a valid license for Compiler"
。
原因在 cmets 中提到,mcc
是一个开发工具,不能部署到仅依赖免费 MCR 运行时的独立程序中。
想一想,如果可能的话,它会破坏购买产品许可证的全部目的,因为您可以创建一个独立程序,无需编译器工具箱就可以编译其他代码:)
【讨论】:
没有提到部署。这个问题纯粹是技术性的。这是评论而不是答案。 @DavidHefernan:MATLAB Compiler (Builder NE) 是一种用于从 MATLAB 代码生成 .NET 程序集的产品,然后可以在 C# 中使用该程序集。mcc
是用于编译代码的命令。所以它与 MATLAB 代码的部署有关(顺便说一句,它是一种解释语言)
是的,我知道。问题是为什么代码会失败。不知道mcc
是否可以重新分发。
因为 mcc
函数不能自己编译。还有其他无法编译的函数列表。
好的,我想我明白了。我认为你的答案不是很清楚。但是,答案正如我在评论中所说的那样。直接从 C# 调用 mcc
。我认为您可以将其添加到答案中。以上是关于从 C# 应用程序内部调用 Matlab 编译器会引发异常的主要内容,如果未能解决你的问题,请参考以下文章
从 C# 错误调用 Matlab 函数:“tes.tambah”的类型初始化程序引发异常
从 C# 调用函数时的 Matlab 异常(MWMCR::EvaluateFunction 错误)