2017-03-25 2 views
1

Ich entwickle eine Kinect-basierte Gestenerkennung auf Unity3D. Ich muss einen Algorithmus verwenden, der in Matlab geschrieben wurde. Also entschied ich mich, eine .Net DLL mit Matlab deploytool zu generieren und das habe ich erfolgreich gemacht. Dann habe ich die DLL in einem eigenständigen .NET-Anwendungsprojekt getestet (in Visual Studio 2017), wo es perfekt funktionierte. ABER, wenn ich zu Unity3D gedreht, dass DLL nie gearbeitet ...... Was ich habe ist, wie unten gezeigt: enter image description hereProbleme bei der Initialisierung von Matlab MCR bei Verwendung einer von Matlab generierten DLL in Unity3D

System.TypeInitializationException: An exception was thrown by the type initializer for Untitled1.ADD ---> System.NotImplementedException: The requested feature is not implemented. 
    at System.Security.Principal.WindowsIdentity.GetCurrent (Boolean ifImpersonating) [0x00000] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Security.Principal/WindowsIdentity.cs:166 
    at MathWorks.MATLAB.NET.Utility.MWMCR.EvaluateFunction (System.String functionName, Int32 numArgsOut, Int32 numArgsIn, MathWorks.MATLAB.NET.Arrays.MWArray[] argsIn) [0x00000] in <filename unknown>:0 
    at MathWorks.MATLAB.NET.Utility.MWMCR.EvaluateFunction (Int32 numArgsOut, System.String functionName, MathWorks.MATLAB.NET.Arrays.MWArray[] argsIn) [0x00000] in <filename unknown>:0 
    at MathWorks.MATLAB.NET.Utility.MWMCR.setBuilderUserData() [0x00000] in <filename unknown>:0 
    at MathWorks.MATLAB.NET.Utility.MWMCR..ctor (System.String componentId, System.String componentPath, System.IO.Stream embeddedCtfStream, Boolean isLibrary) [0x00000] in <filename unknown>:0 
    at Untitled1.ADD..cctor() [0x00000] in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at dlltest.Start() [0x00000] in E:\Unity\mPrj\Assets\dlltest.cs:40 
UnityEngine.Debug:Log(Object) 
dlltest:Start() (at Assets/dlltest.cs:46) 

aus dem Protokoll, schien es, dass die Initialisierung von MCR wurde gescheitert, aber Ich kann einfach nicht herausfinden, warum, nachdem ich den von Matlab generierten C# -Quellcode gesehen habe (wer schon einmal diesen Job gemacht hat, muss wissen, wovon ich rede). Gibt es jemanden, der Erfahrung in dieser Art von Arbeit hat und mir erklären kann, was passiert ist und wie man es löst? Ich danke dir sehr!

Der Namespace des DLL ist Untitled1 (habe keine Zeit, um ihm einen Namen ...) und den Namen der Klasse in der DLL ADD. folgenden sind der zugehörige Code in diesem Verfahren (Testproben):

Matlab Quellcode add.m:

function y = add(n,m) 

    y = n+m; 

Der C-Code #, die von Matlab beim Aufbau der M-Datei in DLL erzeugt wird, zu lang, um hier zu einfügen, so zeige ich nur den Code, der den Konstruktor definiert, bei dem der Fehler in Unity3D nach dem Log passieren:

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

der Code, der erfolgreich die DLL in einem Standalone-Net Application verwendet:

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

     } 
    } 
} 

Und der Code, der ein Unity3D Skript ist, dass die DLL in Unity3D verwenden fehlgeschlagen (einige Kommentare wurden gelöscht):

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

    } 
} 

Antwort

0

Sieht aus wie die statische Ctor von MWMCR Klasse in Mono Classlib in eine nicht unterstützte Aufruf der Methode:

(https://github.com/Unity-Technologies/mono/blob/uniy-trunk/mcs/class/corlib/System.Security.Principal/WindowsIdentity.cs#L166)

Der Grund Ihr Test als eigenständigen gearbeitet .Net ist, dass y Ou führt es wahrscheinlich auf CLR.

Wenn Sie versuchen, Ihr Unity-Projekt auszuführen, verwendet es (in den meisten Fällen) Mono, und dann erhalten Sie diesen Fehler.

Es sollte funktionieren, wenn Sie Ihr Unity-Projekt als "Windows Store App" erstellen (weil in diesem Fall Ihr "Spiel" mit CLR läuft)

Verwandte Themen