将matlab函数集成到c#项目中

将matlab函数集成到c#项目中,c#,.net,matlab,.net-assembly,matlab-compiler,C#,.net,Matlab,.net Assembly,Matlab Compiler,我有一个很好的.net汇编的核心matlab函数,当然是用matlab编译器创建的。对于接受数字或数字数组的函数,这很好;我可以用c#编写代码,而不必返回到matlab(好吧,必须安装RCM;这很好) 但是,对于必须引用其他函数的函数,到目前为止,我能找到的唯一方法是将这两个函数编译到程序集中。为了更好地解释,假设我有一个库,其中存储了ode45例程。如果我想解一个特定的方程,比如说dy/dx=-y,那么我必须创建一个matlab脚本文件,该脚本文件可以编写如下: function dydx =

我有一个很好的.net汇编的核心matlab函数,当然是用matlab编译器创建的。对于接受数字或数字数组的函数,这很好;我可以用c#编写代码,而不必返回到matlab(好吧,必须安装RCM;这很好)

但是,对于必须引用其他函数的函数,到目前为止,我能找到的唯一方法是将这两个函数编译到程序集中。为了更好地解释,假设我有一个库,其中存储了ode45例程。如果我想解一个特定的方程,比如说dy/dx=-y,那么我必须创建一个matlab脚本文件,该脚本文件可以编写如下:

function dydx = diffeq(x, y)
dydx = -y
[很明显,解析解是存在的,但是为了这个例子,让我们假设我想用这种方式来解决它]

现在为了解这个方程,我必须在类中添加这个函数作为方法,以编译到.net程序集中。这当然破坏了我图书馆的概括性;我想在我的核心数学函数库的不同库中使用特定于应用程序的方程。也就是说,ODE45方法应该驻留在“更核心”的库中,而不是驻留在“diffeq”方法的库中

除此之外,我更喜欢在c#类中创建“diffeq”方法,我可以直接在VS2012中编辑该方法。我想直接编辑方程式,而不是每次都要进入matlab并重新编译一个程序集

为了解决这个问题,我已经深入到反编译程序集的程度,该程序集包含ode45代码和我的微分方程方法;结果证明,该组件只是MCR的一个接口;程序集中的diffeq方法返回如下内容:

return mcr.EvaluateFunction(numArgsOut, “diffeq”, new object[0]);
我们注意到函数/方法“diffeq”不是MCR的一部分;MCR没有改变。然而,我在集合中的任何地方都找不到这个等式

这就引出了一个问题:“老兄,我的职能在哪里?”

程序集中有一个“资源”组件,我们在其中找到[classname].ctf,并在其中找到一些机器代码。这看起来是加密的,但等式可能隐藏在那里。如果是这样,那将是我在尝试时故意阻止的,MathWorks让我无法避免进入matlab应用程序,这是我的荣幸

然而,在授权中似乎没有任何东西可以阻止我想做的事情;我认为,如果mathworks允许这样一种开放的方法,那就太好了,但是在interrim中,有人知道如何做到这一点吗?

MATLAB编译器的名字有点误导人。它更像是一种部署解决方案,而不是实际意义上的编译器(参见下面的注释)。它的主要目的是将MATLAB应用程序分发给最终用户,而无需安装完整的MATLAB(只需安装免版税的软件)

MCR实际上是MATLAB引擎的精简版本以及附带的库

使用MATLAB编译器生成二进制包时,结果是一个特定于目标的包装器(无论是独立应用程序、C/C++共享库、Java包还是.NET程序集),用于调用MCR运行时。生成的二进制文件包括一个嵌入式CTF归档文件,其中包含所有原始MATLAB内容(您的M文件和其他依赖项),但以加密形式。当第一次执行时,CTF归档文件被提取到一个临时文件夹中,然后MCR在运行时像典型的MATLAB代码一样解释M文件(仍然加密)

deploytool
mcc-C
)中有一个选项,告诉编译器不要将CTF归档文件作为资源嵌入二进制文件中,而是将其作为一个单独的文件放在生成的二进制文件旁边(这个CTF归档文件可以作为常规ZIP文件进行检查,但其中的源文件当然仍然是加密的)

有关更多信息,请参阅以下文档页:



PS:真相是作为一个产品,将Matlab代码转换成完全C/C++代码,使用现在停止的“Matlab C/C++数学库”(没有运行时要求,只编译生成的C++代码和链接到某些共享库;结果是真正编译的可执行文件而不是包装器)。这个功能在Matlab7发布时就已经完全实现了(原因是旧方法只支持MATLAB语言的一个子集,而使用当前的MCR机制可以部署几乎任何代码)。几年后,MATLAB添加了一个新产品来替换曾经被删除的代码翻译功能,即。

那么你是说,在程序运行时,可以在temp文件夹中访问正常的MATLAB代码?对不起,我的措辞有点含糊不清;提取的文件保持加密形式(AES加密)。我假设MCR知道秘密对称密钥,因此能够解密,然后像往常一样执行代码。有趣的是,只有M文件是加密的(CTF归档文件中包含了来自
prefdir
的其他资源文件和首选项,但没有加密)。目录结构是用相同的文件名复制的,但是M文件中的内容基本上是乱七八糟的。