C#调用matlab生成的DLL

首先我们想要使用matlab,肯定是想要进行科学计算,比如使用matlab里的函数库处理数据。

我这里的版本是matlab2016a,其他版本也可以,主要是版本太旧的话,里面可能就没有你想要的函数。

最重要的提示:所有的路径不要中文,不要中文,不要中文!!!

其次你肯定要写好matlab的代码,用于封装成DLL

PS:一定要在matlab里运行试一试,看看是否真的好用,至少也要能有返回值

接下来就是导出成DLL(看了太多攻略,人都要麻了)

点击【应用程序】

继续点击最右侧箭头显示更多

找到这个

选择:

进去之后选择【.NET Assembly】:

点击+号,将你的.m文件包括的函数放入其中

这里要注意:如果你是绿色版就没办法添加成功,安心的安装和破解

在这里修改类名:非必须

最后一步:点击右上角的绿色对勾,在弹出的窗口选择部署的地方就可以。

到此为止,简单的部署完成了,但是还没完事,接下来是踩坑环节

你肯定不可能只在自己的电脑运行,所以你需要拿好一些东西,用于打包。

如果别人的电脑没有matlab或者和你的版本不一样,你就需要加上打包一个运行时

1.在当前路径下找到一个名叫MWArray.DLL的文件(这个是为了C#和matlab变量之间转换用的)

不一定是2.0,根据你的matlab版本

接着打开刚才的输出目录,找不到的话可以打开你的matlab工程里看下:

把这两个DLL和上面那个DLL,一共三个DLL,放进你的项目文件里,建立一个lib文件夹放进去,然后在你的C#项目里引用这三个DLL

现在你就可以用C#进行开发了,但是还有坑:

如果你用VS开发:

右键项目属性:

属性中选择生成,然后去掉:首选32位

这一步骤的原因主要是为了适配你的matlab版本,如果你的matlab是64位,那么首选32位肯定报错。

你当然也可以:

把这个anyCPU换成x64(对应你的版本)
我估计现在没人32位开发C#软件,前一种方式基本OK

然后你就发现你可以使用DLL里的方法了

但是使用起来有个小问题,就是第一次使用的时候可能是因为启动服务或者怎么事的,有点卡,你可以在界面生成前,跑一个线程,调用一下这个方法,就不会让主线程卡死,下下策。

最后一个问题就是你如何来转换变量,我提供简单的思路,因为我也没用太多次。

我用了点linq,蛮好用的

上面这个例子就是把一个C#的数组变成matlab能识别的变量,然后放入你DLL的方法里当成传参,然后用aa这个对象来接收方法的返回值。

最后来讲运行时:

找到这个路径

把这个路径下的exe打包给没有matlab或者和你的开发版本不一致的电脑上,安装一下。
搞定!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在C#调用MATLAB封装的DLL,需要以下步骤: 1. 在MATLAB中编写并编译DLL,确保它可以在MATLAB中正常运行。可以使用命令行函数“mcc”来编译MATLAB代码并生成DLL。 2. 在C#项目中添加对生成DLL的引用。右键单击项目,选择“添加引用”,然后浏览到DLL文件并选择它。 3. 在C#代码中引入相关的命名空间,如“MathWorks.MATLAB.NET.Arrays”、“MathWorks.MATLAB.NET.Utility”和“MathWorks.MATLAB.NET.ComponentRuntime”。 4. 创建MATLAB的COM对象或.NET程序集对象,并使用它们来调用DLL中的函数。可以使用“Type.GetTypeFromProgID”函数来创建COM对象,或使用“Assembly.LoadFile”函数来加载.NET程序集对象。 5. 调用DLL中的函数并处理返回值。可以使用“MLArray”类来处理从DLL返回的MATLAB数组。 下面是一个示例代码,演示如何在C#调用MATLAB封装的DLL: ```csharp using System; using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.ComponentRuntime; namespace MyNamespace { class MyClass { static void Main(string[] args) { // Create MATLAB COM object Type matlabType = Type.GetTypeFromProgID("Matlab.Application"); dynamic matlab = Activator.CreateInstance(matlabType); // Load MATLAB-generated DLL AssemblyLoader loader = new AssemblyLoader(); loader.AddPath(@"C:\path\to\dll"); Assembly assembly = loader.Load("MyDLL"); // Call DLL function dynamic myFunction = assembly.CreateInstance("MyNamespace.MyClass"); MWArray result = myFunction.MyMethod(new MWNumericArray(1), new MWNumericArray(2)); // Process result double[] output = (double[])result.ToArray(typeof(double)); Console.WriteLine(output[0]); } } } ``` 这个例子假设你的DLL文件名为"MyDLL.dll",包含一个名为"MyClass"的类,其中有一个名为"MyMethod"的函数,接受两个数字参数并返回一个数字结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C#SMVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值