我发现这个代码调用了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行。
答案 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运行时的独立程序。
考虑一下,如果可能的话,它会破坏购买产品许可证的整个目的,因为你可以创建一个独立的程序,可以在没有编译器工具箱的情况下编译其他代码:)