2015-06-09 5 views
7

Beim Ausführen dieses Programms bekomme ich weiterhin den Fehler: Eine unbehandelte Ausnahme vom Typ 'System.Security.SecurityException' aufgetreten Zusätzliche Informationen: ECall Methoden müssen in einem Systemmodul verpackt sein.C# Sicherheitsausnahme

class Program{ 
     public static void Main() 
     { 
      Brekel_ProBody2_TCP_Streamer s = new Brekel_ProBody2_TCP_Streamer(); 
      s.Start(); 
      s.Update(); 
      s.OnDisable(); 
     } 
    } 

Wie kann ich das beheben?

Der wichtige Teil der Brekel Bibliothek ist wie folgt:

//====================================== 
    // Connect to Brekel TCP network socket 
    //====================================== 
    private bool Connect() 
    { 
     // try to connect to the Brekel Kinect Pro Body TCP network streaming port 
     try 
     { 
      // instantiate new TcpClient 
      client = new TcpClient(host, port); 

      // Start an asynchronous read invoking DoRead to avoid lagging the user interface. 
      client.GetStream().BeginRead(readBuffer, 0, READ_BUFFER_SIZE, new AsyncCallback(FetchFrame), null); 

      Debug.Log("Connected to Brekel Kinect Pro Body v2"); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Debug.Log("Error, can't connect to Brekel Kinect Pro Body v2!" + ex.ToString()); 
      return false; 
     } 
    } 


    //=========================================== 
    // Disconnect from Brekel TCP network socket 
    //=========================================== 
    private void Disconnect() 
    { 
     if (client != null) 
      client.Close(); 
     Debug.Log("Disconnected from Brekel Kinect Pro Body v2"); 
    } 

public void Update() 
{ 
    // only update if connected and currently not updating the data 
    if (isConnected && !readingFromNetwork) 
    { 
     // find body closest to the sensor 
     closest_skeleton_ID = -1; 
     closest_skeleton_distance = 9999999f; 
     for (int bodyID = 0; bodyID < skeletons.GetLength(0); bodyID++) 
     { 
      if (!skeletons[bodyID].isTracked) 
       continue; 
      if (skeletons[bodyID].joints[(int)brekelJoint.waist].position_local.z < closest_skeleton_distance) 
      { 
       closest_skeleton_ID = bodyID; 
       closest_skeleton_distance = skeletons[bodyID].joints[(int)brekelJoint.waist].position_local.z; 
      } 
     } 

     // apply to transforms (cannot be done in FetchFrame, only in Update thread) 
     for (int bodyID = 0; bodyID < skeletons.GetLength(0); bodyID++) 
     { 
      for (int jointID = 0; jointID < skeletons[bodyID].joints.GetLength(0); jointID++) 
      { 
       // only apply if transform is defined 
       if (skeletons[bodyID].joints[jointID].transform != null) 
       { 
        // apply position only for waist joint 
        if (jointID == (int)brekelJoint.waist) 
         skeletons[bodyID].joints[jointID].transform.localPosition = skeletons[bodyID].joints[jointID].position_local; 

        // always apply rotation 
        skeletons[bodyID].joints[jointID].transform.localRotation = skeletons[bodyID].joints[jointID].rotation_local; 
       } 
      } 
     } 
+0

Nicht vertraut mit dieser Brekel TCP-Bibliothek. Einen Link haben? Was tut es? –

+0

Es ist ziemlich lang, aber die Idee ist, Skelettdaten von Microsoft Kinect zu erfassen, die Daten sofort zu übertragen, wenn sich jemand im Kinects-Sichtfeld bewegt, und dann die TCP-Verbindung zwischen der Brekel-Software und Visual Studio zu schließen. Ich werde die Bibliothek in einen Kommentar einfügen, falls Sie es sehen wollen. –

+1

möglich duplizieren (oder nur eine verwandte Frage) von http://stackoverflow.com/questions/11286004/securityexception-ecall-methods-must-be-packaged-into-a-system-module –

Antwort

18

Es scheint, dass Sie eine Unity-Bibliothek verwenden, sondern versuchen, es als eigenständige Anwendung laufen zu lassen?

Dieser Fehler bedeutet, dass Sie eine Methode aufrufen, die in der Unity-Engine implementiert ist. Sie können die Bibliothek nur in Unity verwenden.

Wenn Sie eigenständige es verwenden möchten, werden Sie die Bibliothek kompilieren müssen, um alle Unity-Bibliotheken ohne Referenzierung, was wahrscheinlich bedeutet, dass Sie Implementierungen für alles zur Verfügung stellen müssen die Bibliothek (zB MonoBehaviour

http://forum.unity3d.com/threads/c-error-ecall-methods-must-be-packaged-into-a-system-module.199361/

http://forum.unity3d.com/threads/security-exception-ecall-methods-must-be-packaged-into-a-system-module.98230/

+0

Könnte ich meinen Code theoretisch einfach in Unity kopieren und hinterlegen, anstatt ihn eigenständig zu machen? Ich habe keinen Grund, dass es eigenständig sein muss. –

+0

ja in der Tat. Führen Sie es einfach in Unity aus. – Brandon

0

Zusätzlich Wenn Ihr Problem ist nur debug.log() eine Ausnahme zu werfen, könnten Sie Reflexion pflanzen Sie Ihre eigene Logger Instanz anstelle von Unity eine verwenden.

Schritt 1: Erstellen Sie "MyLogHandler", die Ihre tatsächliche Protokollierung (Schreiben in Datei oder Konsole oder nichts tun) tun. Ihre Klasse muss die "ILogHandler" -Schnittstelle implementieren.

Schritt 2: Ersetzen Sie die Einheit standardmäßig durch eine neue.

var newLogger = new Logger(new MyLogHandler()); 
var fieldInfo = typeof(Debug).GetField("s_Logger", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static); 
     fieldInfo.SetValue(null, newLogger); 

Hinweis: Beachten Sie, dass Reflexion Feld mit Namen zugreift und wenn Unity entscheiden, es in Zukunft zu ändern, werden Sie nicht bekommen Fehler kompilieren - Ausnahme wird in der Laufzeit geworfen werden.