从 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#编写的DLL文件怎么导出函数?

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

从 MATLAB Compiler 应用程序调用 python 时无法调用 python 库

从 C 调用 MATLAB

从 C# Windows 窗体内部调用的 Bash 脚本