2015-06-09 19 views
7

Podczas pracy z tym programem nadal pojawia się błąd: Nieobsługiwany wyjątek typu "System.Security.SecurityException" wystąpił Informacje dodatkowe: Metody ECall muszą być spakowane w module systemowym.C# Security Exception

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

Jak mogę to naprawić?

Ważną częścią biblioteki Brekel jest następujący:

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

Nie znasz tej biblioteki TCP Brekela. Masz link? Co to robi? –

+0

Jest to dość długotrwałe, ale chodzi o to, aby wychwycić dane szkieletu z Microsoft Kinect, przesyłać dane natychmiastowo, gdy ktoś porusza się w polu widzenia Kinect, a następnie zamknąć połączenie tcpip między oprogramowaniem Brekel i studio graficznym. Wkleję bibliotekę w komentarzu poniżej, na wypadek, gdybyś chciał ją zobaczyć. –

+1

możliwy duplikat (lub tylko powiązane pytanie) z http://stackoverflow.com/questions/11286004/securityexception-ecall-methods-must-be-packaged-into-a-system-module –

Odpowiedz

18

Wydaje używasz biblioteki Unity ale próbuje uruchomić go jako samodzielna aplikacja?

Ten błąd oznacza wywołanie metody zaimplementowanej w silniku Unity. Możesz korzystać z biblioteki tylko w Unity.

Jeśli chcesz go używać samodzielnie, musisz skompilować bibliotekę bez odwoływania żadnych bibliotek jedności, co prawdopodobnie oznacza, że ​​będziesz musiał dostarczyć implementacje dla czegokolwiek biblioteka korzysta (np 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

Teoretycznie, czy mogę po prostu skopiować i przekazać mój kod do Unity, zamiast tworzyć go samodzielnie? Nie mam powodu, dla którego musi być samodzielny. –

+0

tak, rzeczywiście. Po prostu uruchom go z poziomu Unity. – Brandon

0

Dodatkowo Jeśli jedynym problemem jest debug.log() rzuca wyjątek, można użyć refleksji zasadzić własną instancję Logger zamiast jednego Unity.

Krok 1: Utwórz "MyLogHandler", który wykona rzeczywiste logowanie (zapis do pliku lub do konsoli lub nic nie rób). Twoja klasa musi wdrożyć interfejs "ILogHandler".

Krok 2: Wymień domyślną jedność na nową.

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

Uwaga: Należy pamiętać, że odbicie dostęp pole nazwy i jeśli Unity decydują się zmienić w przyszłości, nie dostaniesz błąd kompilacji - zostanie wyrzucony wyjątek w czasie wykonywania.