如何在没有MCR/MATLAB的情况下使用C#中的MATLAB编译DLL

本文关键字:MATLAB 中的 DLL 编译 情况下 MCR | 更新日期: 2024-04-03 07:07:26

很抱歉已经问了这个问题,但我找不到我一直在找的东西。我想知道是否有一种方法可以在c#中使用MATLAB编译的c共享库,而无需使用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(这会让事情变得更容易),但现在我受到了限制。

提前感谢您的帮助。

如何在没有MCR/MATLAB的情况下使用C#中的MATLAB编译DLL

不幸的是,您所要求的是不可能的。MATLAB编译器生成的任何内容都需要系统上安装的MATLAB运行时。可以作为MATLAB安装本身的一部分,也可以单独安装。为什么?因为代码生成了对这些库的调用。

你知道你可以免费分发MCR安装程序,而不会有任何版税问题,对吧?

现在,另一方面,如果你真的想摆脱MATLAB,那么你需要看看MATLAB编码器。这是MATLAB中(据我所知)唯一一个可以让你创建真正独立代码的组件。坏消息是,它只输出到C/C++。

正如其他人所说,使用MATLAB编译器生成的任何内容都需要MCR。

集成MATLAB和C#的另一个选项是使用MATLAB COM Automation。参见此处获取示例:

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);
        }
    }
}