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

时间:2013-03-29 21:10:08

标签: c# matlab matlab-deployment matlab-compiler

我发现这个代码调用了Matlab编译器,当从Matlab命令提示符调用函数时它工作正常,我将此函数构建到.Net汇编但是每当我尝试在我的C#app中使用它来构建一些.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 error ...未定义的函数'mcc'表示   输入'char'类型的参数。错误=>第9行的compileCode.m。

     

... Matlab M代码堆栈跟踪...       在文件C:\ Users \ ePezhman \ AppData \ Local \ Temp \ ePezhman \ mcrCache8.0 \ compil0 \ compiler \ compileCode.m,   name compileCode,第9行。

1 个答案:

答案 0 :(得分: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"

原因如评论中所述,mcc是一个开发工具,无法部署到仅依赖于免费MCR运行时的独立程序。

考虑一下,如果可能的话,它会破坏购买产品许可证的整个目的,因为你可以创建一个独立的程序,可以在没有编译器工具箱的情况下编译其他代码:)