很抱歉,如果这个问题已被提出,但我找不到我一直在寻找的东西。我想知道是否有办法在C#中使用MATLAB编译的c-shared库而不使用MCR / MATLAB(或者通常任何其他安装),例如使用这个简单的函数test.m,通过mcc编译成.dll然后在C#中使用它:
[x,y,z]=test(a,b,c)
%x,a are integers
%y,z,b are matrices
%c is a string (which e.g. could be used to switch between several modes)
x=a*a;
y=b*b-b;
z=y*y;
我不完全确定是否有可能(更不用说容易)这样做,但即使使用这个简单的例子,我也无法在C#中使用它,尽管这也可能与我非常有限的C#有关经验。我想在这个例子中我将不得不使用IntPtr来处理矩阵,例如:
[DllImport("test.dll",EntryPoint="mlfTest")]
public static extern void testfunction([In] numargout, ref IntPtr x, ref IntPtr y, ref IntPtr z, [In] IntPtr a, [In] ref double[,] b, [In] ref c)
然后通过与Marshal一起工作来尝试从x,y,z中获取数据?我想我也犯了一些相当明显的错误,例如:我不确定我是否可以将ref double [,]传递给dll并期望它能够正常工作。
我想如果绝对必要的话我可以使用MCR(这会让事情变得更容易),但是现在我受到了限制。
提前感谢您的帮助。
答案 0 :(得分:3)
不幸的是,你所要求的是不可能的。由MATLAB编译器生成的任何内容 需要 系统上安装的MATLAB Runtime。既可以作为MATLAB安装本身的一部分,也可以单独使用。为什么?因为生成的代码会调用这些库。
您知道您可以免费分发MCR安装程序而不会出现任何版税问题,对吗?
现在,另一方面,如果你真的想要摆脱MATLAB,那么你需要看看MATLAB Coder。它是MATLAB中唯一可以创建真正独立代码的组件(我知道)。坏消息是它只输出到C / C ++。
答案 1 :(得分:1)
正如其他人所说,使用MATLAB编译器生成的任何内容都需要MCR。
集成MATLAB和C#的另一个选择是使用MATLAB COM Automation。有关示例,请参阅here:
using System;
namespace testMATLAB
{
class Program
{
static void Main(string[] args)
{
MLApp.MLAppClass matlab = new MLApp.MLAppClass();
System.Array pr = new double[4];
pr.SetValue(11, 0);
pr.SetValue(12, 1);
pr.SetValue(13, 2);
pr.SetValue(14, 3);
System.Array pi = new double[4];
pi.SetValue(1, 0);
pi.SetValue(2, 1);
pi.SetValue(3, 2);
pi.SetValue(4, 3);
matlab.PutFullMatrix("a", "base", pr, pi);
System.Array prresult = new double[4];
System.Array piresult = new double[4];
matlab.GetFullMatrix("a", "base", ref prresult, ref piresult);
}
}
}