C# 调用Matlab打包的 DLL文件(傻瓜式操作)

1、准备Matlab代码

在这里插入图片描述

2. 打包

  • 在matlab命令行窗口输入deploytool,打开MATLAB Complier,选择Library Compiler
    在这里插入图片描述

  • TYPE中选择.NET Assembly;在EXPORTED FUNCTIONS中选择要打包的文件;可以选择为自己打包的文件自定义NameSpace名称,本例中将NameSpace定义为JudgeByCC,然后选择Package即可。稍等一会,即可看到打包后的文件。

  • 在这里插入图片描述
    在这里插入图片描述

  • 打包结束后,会自动打开输出文件的目录,如下图所示,打开for_redistribution_files_only文件夹,即可看到打包好的dll文件。
    在这里插入图片描述
    在这里插入图片描述

3. 新建C# 控制台项目

  • 在Virual Studio中新建C#控制台项目
    在这里插入图片描述
  • 项目建好后,首先在主函数里面打印一句Hello World!,确保新建的项目能正常运行。
    在这里插入图片描述

4. 配置

  • 双击项目的Properties或者右键项目,选择属性,选择引用路径,添加自己打包好的dll文件和Matlab中MWArray.dll的文件目录,然后记得按Ctrl+s进行保存。
    在这里插入图片描述
  • 右键引用,选择添加引用,打开引用管理器。
    在这里插入图片描述
  • 在引用管理器中选择自己打包的DLL文件和MWArray,然后点击确定。 至此,C#项目配置的环境就结束了。
    在这里插入图片描述

5. 编写测试代码并运行

  • 编写测试代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using JudgeByCC;
using MathWorks.MATLAB.NET.Arrays;

namespace ConsoleApp5
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            JudgeByCC.Class1 class1 = new JudgeByCC.Class1();
           	// 只显示部分数据
            double[] array = { 1.1965, -0.548, 0.0155, 0.317, -3.462, 1.5475, 2.1625, 2.14, 0.733, 1.2965, -3.7535 };
            MWNumericArray myArray  = new MWNumericArray(array); // double数组转为MWArray类型数组

            MWArray[] dpsdo = new MWArray[1];
            dpsdo[0] = 12;

            // 测试运行效率
            for(int i=0; i < 10000; i++)
            {
                Console.WriteLine(class1.main_entrance_JudgeByCC(myArray, dpsdo[0]));
                Console.WriteLine("代码执行成功!" + i);
            }
          

            Console.WriteLine("代码执行成功!");

        }
    }
}

  • 运行
    在这里插入图片描述

可能会遇到的问题及解决方案

未经处理的异常: System.TypeInitializationException: “JudgeByCC.Class1”的类型初始值设定项引发异常。 —> System.TypeInitializationException: “MathWorks.MATLAB.NET.Utility.MWMCR”的类型初始值设定项引发异常。 —> System.TypeInitializationException: “MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常。 —> System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
在 MathWorks.MATLAB.NET.Arrays.MWArray.mclmcrInitialize2(Int32 primaryMode)
在 MathWorks.MATLAB.NET.Arrays.MWArray…cctor()
— 内部异常堆栈跟踪的结尾 —
在 MathWorks.MATLAB.NET.Utility.MWMCR…cctor()
— 内部异常堆栈跟踪的结尾 —
在 JudgeByCC.Class1…cctor()
— 内部异常堆栈跟踪的结尾 —
在 JudgeByCC.Class1…ctor()
在 ConsoleApp5.Program.Main(String[] args) 位置 F:\VS_project\ConsoleApp5\Program.cs:行号 18

在这里插入图片描述
如果在代码运行时出现上图中的错误,如果确定自己的Matlab代码、打包、以及调用都没有问题,则有可能是自己电脑运行的目标平台环境不一致所导致的。具体修改方式如下:

解决方案:

  1. 右键 项目-> 选择“属性”
    在这里插入图片描述
  2. 点击“生成”->“目标平台”
    在这里插入图片描述
  3. 根据自己的运行环境选择合适的位数即可,笔者使用的是X64系统,故选择x64即可。然后按“ctrl+s”进行保存即可。再次运行,发现代码即可正常运行,至此,问题解决。
    在这里插入图片描述
    在这里插入图片描述
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在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"的函数,接受两个数字参数并返回一个数字结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值