Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#应用程序内部调用Matlab编译器会引发异常_C#_Matlab_Matlab Deployment_Matlab Compiler - Fatal编程技术网

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

从C#应用程序内部调用Matlab编译器会引发异常,c#,matlab,matlab-deployment,matlab-compiler,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)

我发现这段代码是用来调用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#代码:

例外情况:

。。。MWMCR::EvaluateFunction错误。。。未定义的函数“mcc”用于 “char”类型的输入参数。第9行=>compileCode.m中出错

。。。Matlab M码堆栈跟踪。。。 在文件C:\Users\ePezhman\AppData\Local\Temp\ePezhman\mcrCache8.0\compile0\compiler\compileCode.m中, 名称编译代码,第9行


有趣的是,我假设您正在尝试编译一个可以动态编译其他函数的函数

不幸的是,我认为
mcc
函数本身无法编译/部署


确切地说,您看到的问题是因为MATLAB需要知道编译时调用的所有函数,并且通过使用
eval
,它无法自己计算出来(因为它不会在字符串内部进行解析)。您可以通过编写编译器来解决此特定问题

function myEval()
    %#function foo
    eval('...');
end
(另一种选择是使用)

即使您这样做,它仍会在运行时在
mcc
函数中失败,并指出:
“许可证签出失败,[…]无法找到编译器的有效许可证”

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


想一想,如果可能的话,它会破坏为产品购买许可证的整个目的,因为您可以创建一个独立的程序来编译其他代码,而无需使用编译器工具箱:)

有趣的是,我假设您正在尝试编译一个可以动态编译其他函数的函数

不幸的是,我认为
mcc
函数本身无法编译/部署


确切地说,您看到的问题是因为MATLAB需要知道编译时调用的所有函数,并且通过使用
eval
,它无法自己计算出来(因为它不会在字符串内部进行解析)。您可以通过编写编译器来解决此特定问题

function myEval()
    %#function foo
    eval('...');
end
(另一种选择是使用)

即使您这样做,它仍会在运行时在
mcc
函数中失败,并指出:
“许可证签出失败,[…]无法找到编译器的有效许可证”

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


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

直接从C#调用命令会容易得多。使用
Process.Start()
。直接从C#调用命令会容易得多。使用
Process.Start()
。这里没有提到部署。这个问题纯粹是技术性的。这是一个注释而不是答案。@DavidHefernan:MATLAB编译器(Builder NE)是一个用于从MATLAB代码生成.NET程序集的产品,然后可以从C#中使用
mcc
是用于编译代码的命令。这是关于MATLAB代码的部署(顺便说一下,这是一种解释语言)是的,我知道。问题是为什么代码会失败。不知道是否可以重新分配
mcc
。因为
mcc
函数本身无法编译。还有一个无法编译的函数列表。好的,我想我明白了。我认为你的答案不太清楚。不过,答案正如我在评论中所说。直接从C#呼叫
mcc
。我认为你可以在答案中添加这一点,但没有提到部署。这个问题纯粹是技术性的。这是一个注释而不是答案。@DavidHefernan:MATLAB编译器(Builder NE)是一个用于从MATLAB代码生成.NET程序集的产品,然后可以从C#中使用
mcc
是用于编译代码的命令。这是关于MATLAB代码的部署(顺便说一下,这是一种解释语言)是的,我知道。问题是为什么代码会失败。不知道是否可以重新分配
mcc
。因为
mcc
函数本身无法编译。还有一个无法编译的函数列表。好的,我想我明白了。我认为你的答案不太清楚。不过,答案正如我在评论中所说。直接从C#呼叫
mcc
。我认为你可以在答案中加入这一点。