2015-06-09 17 views
7

Durante l'esecuzione di questo programma continuo a ricevere l'errore: Si è verificata un'eccezione non gestita di tipo 'System.Security.SecurityException' Ulteriori informazioni: I metodi ECall devono essere inseriti in un modulo di sistema.C# Eccezione di sicurezza

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

Come posso risolvere questo problema?

La parte importante della biblioteca Brekel è la seguente:

//====================================== 
    // 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

Non ho familiarità con questa libreria Brekel TCP. Hai un link? Che cosa fa? –

+0

È piuttosto lungo, ma l'idea è quella di acquisire dati scheletrici da Microsoft Kinect, trasmettere i dati istantaneamente mentre qualcuno si muove nel campo di vista Kinects e quindi chiudere la connessione tcpip tra il software Brekel e lo studio visivo. Incollerò la libreria in un commento qui sotto nel caso in cui tu voglia vederlo. –

+1

possibile duplicato (o solo una domanda correlata) di http://stackoverflow.com/questions/11286004/securityexception-ecall-methods-must-be-packaged-into-a-system-module –

risposta

18

Sembra che si sta utilizzando una libreria di Unity ma cercando di farlo funzionare come applicazione autonoma?

Questo errore indica che si sta chiamando un metodo implementato all'interno del motore Unity. Puoi utilizzare la libreria solo da Unity.

Se si desidera utilizzarlo standalone, è necessario compilare la libreria senza fare riferimento librerie Unity, che probabilmente significa che è necessario fornire implementazioni per nulla la libreria sta utilizzando (come ad esempio 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

In teoria, potrei semplicemente copiare e incollare il mio codice in Unity invece di renderlo standalone? Non ho motivo per cui debba essere autonomo. –

+0

sì, certo. Basta eseguirlo da dentro Unity. – Brandon

0

Inoltre, Se il vostro unico problema è debug.log() un'eccezione, è possibile utilizzare la reflection per piantare il vostro propria istanza Logger invece della propria unità.

Passaggio 1: Creare "MyLogHandler" che eseguirà la registrazione effettiva (scrivere su file o su console o non eseguire nulla). La tua classe deve implementare l'interfaccia "ILogHandler".

Passaggio 2: Sostituire l'unità predefinita con una nuova.

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

Nota: Tenete a mente che la riflessione accede campo per nome e, se l'Unità decidere di cambiare in futuro, non sarà possibile ottenere errore di compilazione - verrà generata un'eccezione in fase di esecuzione.