-->

从内C#应用程序抛出异常调用Matlab编译器(Calling Matlab Compiler fr

2019-10-17 21:51发布

我发现这个代码来调用Matlab的编译器,它工作正常时,函数从MATLAB命令提示符叫,我建立这个功能.NET程序集,但每当我试图尽可能地使用它在我的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”类型“字符”的输入参数。 误差在=> compileCode.m第9行。

... MATLAB M代码堆栈跟踪......在文件C:\用户\ ePezhman \应用程序数据\本地的\ Temp \ ePezhman \ mcrCache8.0 \ compil0 \编译\ compileCode.m,名compileCode,9号线。

Answer 1:

有趣的是,我假设你正在试图编译可以动态编译其他功能的功能..

不幸的是,我不认为mcc功能可以被编译/部署本身


确切的说,你所看到的问题是,因为MATLAB需要知道所谓的在编译时的所有功能,并通过使用eval ,它不会弄清楚自身的(因为它不会在字符串中解析)。 您可以通过编写解决这一特殊问题特殊的注释编译器..

function myEval()
    %#function foo
    eval('...');
end

(另一种方法是使用函数处理 )。

不过,即使你做到这一点,将在内部运行时失败mcc功能说: "License checkout failed, [...] Cannot find a valid license for Compiler"

其原因是,在评论中提到的, mcc是一个开发工具,不能被部署到独立的只取决于自由MCR运行程序。

想想看,如果有可能,它会打败购买许可的产品,因为你可以创建一个独立的程序,可以编译其他代码,无需编译器工具箱的全部目的:)



文章来源: Calling Matlab Compiler from inside C# app throws exception