Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Unity3D中使用Matlab生成的DLL时,初始化Matlab MCR时遇到问题_C#_Matlab_Unity3d_Dll - Fatal编程技术网

C# 在Unity3D中使用Matlab生成的DLL时,初始化Matlab MCR时遇到问题

C# 在Unity3D中使用Matlab生成的DLL时,初始化Matlab MCR时遇到问题,c#,matlab,unity3d,dll,C#,Matlab,Unity3d,Dll,我正在Unity3D上开发一个基于Kinect的手势识别应用程序。我必须使用一个用Matlab编写的算法。因此,我决定用MatlabDeployTool生成一个.NETDLL,我成功地做到了这一点。然后,我在一个独立的.Net应用程序项目(在Visual Studio 2017中)中测试了DLL,它在该项目中运行良好。但是,当我转向Unity3D时,该DLL从未工作过。。。。。。我得到的结果如下所示: 在将M文件构建到DLL中的过程中由Matlab生成的C#代码太长,无法粘贴到此处,因此我仅显

我正在Unity3D上开发一个基于Kinect的手势识别应用程序。我必须使用一个用Matlab编写的算法。因此,我决定用MatlabDeployTool生成一个.NETDLL,我成功地做到了这一点。然后,我在一个独立的.Net应用程序项目(在Visual Studio 2017中)中测试了DLL,它在该项目中运行良好。但是,当我转向Unity3D时,该DLL从未工作过。。。。。。我得到的结果如下所示:

在将M文件构建到DLL中的过程中由Matlab生成的C#代码太长,无法粘贴到此处,因此我仅显示定义构造函数的代码,根据日志,Unity3D中的错误发生在该代码处:

static ADD()
{
  if (MWMCR.MCRAppInitialized)
  {
    Assembly assembly= Assembly.GetExecutingAssembly();

    string ctfFilePath= assembly.Location;

    int lastDelimiter= ctfFilePath.LastIndexOf(@"\");

    ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter));

    string ctfFileName = "Untitled1.ctf";

    Stream embeddedCtfStream = null;

    String[] resourceStrings = assembly.GetManifestResourceNames();

    foreach (String name in resourceStrings)
    {
      if (name.Contains(ctfFileName))
      {
        embeddedCtfStream = assembly.GetManifestResourceStream(name);
        break;
      }
    }
    mcr= new MWMCR("",
                   ctfFilePath, embeddedCtfStream, true);
  }
  else
  {
    throw new ApplicationException("MWArray assembly could not be initialized");
  }
}
在独立.Net应用程序中成功使用DLL的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using Untitled1;

namespace AddDllTest
{
    class Program
    {
        static void Main(string[] args)
        {

            ADD myAdd = new ADD();

            Console.WriteLine(myAdd.add((MWArray)1, (MWArray)1));

        }
    }
}
以及无法在Unity3D中使用DLL的代码(Unity3D脚本)(某些注释已被删除):


看起来MWMCR类的静态构造函数正在调用Mono classlib中不受支持的方法:

()

您的测试作为独立的.Net工作的原因是您可能正在CLR上运行它

当您尝试运行Unity项目时,它使用Mono(在大多数情况下),然后您会遇到此错误


如果您将Unity项目构建为“Windows应用商店应用程序”(因为在这种情况下,您的“游戏”将使用CLR运行)

看起来MWMCR类的静态ctor正在调用Mono classlib中不受支持的方法:

()

您的测试作为独立的.Net工作的原因是您可能正在CLR上运行它

当您尝试运行Unity项目时,它使用Mono(在大多数情况下),然后您会遇到此错误

如果您将Unity项目构建为“Windows应用商店应用程序”(因为在这种情况下,您的“游戏”将使用CLR运行),那么它应该可以工作

static ADD()
{
  if (MWMCR.MCRAppInitialized)
  {
    Assembly assembly= Assembly.GetExecutingAssembly();

    string ctfFilePath= assembly.Location;

    int lastDelimiter= ctfFilePath.LastIndexOf(@"\");

    ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter));

    string ctfFileName = "Untitled1.ctf";

    Stream embeddedCtfStream = null;

    String[] resourceStrings = assembly.GetManifestResourceNames();

    foreach (String name in resourceStrings)
    {
      if (name.Contains(ctfFileName))
      {
        embeddedCtfStream = assembly.GetManifestResourceStream(name);
        break;
      }
    }
    mcr= new MWMCR("",
                   ctfFilePath, embeddedCtfStream, true);
  }
  else
  {
    throw new ApplicationException("MWArray assembly could not be initialized");
  }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using Untitled1;

namespace AddDllTest
{
    class Program
    {
        static void Main(string[] args)
        {

            ADD myAdd = new ADD();

            Console.WriteLine(myAdd.add((MWArray)1, (MWArray)1));

        }
    }
}
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices; 
using RootSystem = System;
using System;
using System.Reflection;
using System.IO;
using Untitled1;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;

public class dlltest : MonoBehaviour {

    MWArray test1 = 1;
    MWArray ref0 = 2;
    MWArray result;
    ADD myADD;

    //Use this for initializations
    void Start () {

        try
        {
            myADD = new ADD();
        }
        catch (Exception e)
        {
            Debug.Log("EXCEPTION");

            Debug.Log(e.ToString());
        }

    }

    // Update is called once per frame
    void Update () {

        result = myADD.add(test1,ref0);
        Debug.Log(result);

    }
}