c#调用python

项目需要在c#运行,本人不会c#,需要将matlab的算法供c#调用,总结一下本人使用过的方法:
只想看c#调用python的可以往后翻翻,先讲matlab

首先是matlab转为c++代码

期待用matlab转c++代码,然后生成动态链接库供c#调用,这里需要用到matlab的coder工具,实际用了一下,感觉这是不可能的,因为首先matlab语法要做大量修改而且,生成的 代码很乱。特别是算法较大的时候,几乎不可能。

matlab生成动态链接库

这个是最简单的,我是用的是matlab2021b,就拿2020b举例,下载MCRII解释器好像低版本的matlab默认是下载了这个的,你在你的安装目录找到他安装就行,没安装的matlab命令行输入
>> compiler.runtime.download
下载完成后解压安装

  • 查看可用的visual studio
    mbuild -setup
    在这里插入图片描述
  • 输入命令deploytool
  • 选择第三个Library Compiler
    在这里插入图片描述
  • 选择.net assembly选择转换的函数
  • 设置名称空间和方法名(我之前导过,所以这里就没设置了)
    在这里插入图片描述
  • 会生成一个文件夹包含以下内容
    在这里插入图片描述
  • 新建一个控制台程序
  • 解决方案资源管理器面板右击引用选项
  • 点击添加引用,浏览找到这些文件添加引用(前面4个是我自定义的函数生成的dll,都是按刚才的方法生成的,最后一个和matlab有关,参考我的路径,找到你自己的。
    在这里插入图片描述
    因为我不是太懂,所以我直接把生成的东西都复制到项目的Debug目录了,其实好像不用这样。c#代码是参考别人改的,具体参考哪位的我也记不清了,,,见谅见谅,c#实在是不太懂。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using myfunc;
using CLASSIFY;
namespace ConsoleApp12
{
    class Program
    {
        static void Main(string[] args)
        {

            Train_Model.Class1 d = new Train_Model.Class1();
            eegpredict.eegpredict d1 = new eegpredict.eegpredict();
            MWArray[] argsOut = new MWArray[1];
            MWArray[] argsIn = new MWArray[] { };
            MWArray[] argsOut1 = new MWArray[1];
            MWArray[] argsIn1 = new MWArray[] { };
            d.train_model(1, ref argsOut, argsIn);
            d1.EegPredict(1, ref argsOut1, argsIn1);
            MWNumericArray mw = argsOut[0] as MWNumericArray;
            MWNumericArray mw1 = argsOut1[0] as MWNumericArray;
            double[,] res = (double[,])mw.ToArray();
            string str = res[0, 0].ToString("F2");
            double[,] res1 = (double[,])mw1.ToArray();
            string str1 = res1[0, 0].ToString("F2");
            Console.WriteLine(res);
            Console.WriteLine(str);
            Console.WriteLine(res1);
            Console.WriteLine(str1);
            Console.ReadKey();
        }
    }
}

至此,完成功能,缺点是太慢了,matlab解释器太大了,对性能要求过高。速度慢到无语,当然在matlab本身跑的就慢。。根本不能奢望,,
有点也很明显,就是图形界面操作非常简单
在这里插入图片描述

采用c#调用python

matlab太慢,只能另想办法,我就用python重写了代码,上网搜如何用c#调用python,搜到很多方法。

  • 首先可以python编译成dll调用
    采用cython编译成dll。这个方法网上教程很多,我和我旁边的python程序员试了挺久也没搞定,配置环境这个事最烦了,后来直接放弃。
  • 采用ironpython
    这个东西倒是试了,照着网上教程下载了ironpython,简单的程序调用成功,但是涉及第三方库的程序总是module not found,尝试使用sys.path.append() 也没有搞定,反正试了挺久的,配置环境太烦了,后来直接放弃。但是如果成功的话,这个方法应该是交互性最好的。
  • 采用这个博主的方法尝试调用,调用成功,速度是matlab六七倍左右,在此感谢,这个方法其实就是感觉和在控制台调用python差不多。 博客地址不过可惜的是这种方法没办法做到源码保密,,
  • 没法做到源码保密肯定是不行的,我继续搜索,发现python的.pyc和.pyd文件可以实现源码保密,但是.pyc文件反编译很容易,只能采用.pyd这个东西有的博主说是相当于python里面的动态链接库。下面详细介绍如何使用。使用方法完全参考下面两位博主即可:
  • python编译为pyd
  • c#调用pyd
  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值