2015-06-09 2 views
7

При запуске этой программы я продолжаю получать сообщение об ошибке: Произошло необработанное исключение типа «System.Security.SecurityException» Дополнительная информация: ECall-методы должны быть упакованы в системный модуль.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(); 
     } 
    } 

Как это исправить?

Важной частью библиотеки Brekel выглядит следующим образом:

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

Не знаком с этой библиотекой Брекеля TCP. У вас есть ссылка? Что оно делает? –

+0

Это довольно длинный, но идея состоит в том, чтобы захватить скелетные данные из Microsoft Kinect, мгновенно передавать данные, когда кто-то перемещается в поле зрения Kinects, а затем закрывает соединение tcpip между программным обеспечением Brekel и визуальной студией. Я вставлю библиотеку в комментарии ниже, если вы хотите ее увидеть. –

+1

Возможный дубликат (или только связанный с ним вопрос) http://stackoverflow.com/questions/11286004/securityexception-ecall-methods-must-be-packaged-into-a-system-module –

ответ

18

Похоже, вы используете библиотеку Unity, но при попытке запустить его как отдельное приложение?

Эта ошибка означает, что вы вызываете метод, реализованный в движке Unity. Вы можете использовать библиотеку только из Unity.

Если вы хотите использовать его автономно, вы должны скомпилировать библиотеку без привязки каких-либо библиотек Unity, который, вероятно, означает, что вы должны будете предоставить реализации для что-нибудь библиотека с помощью (например, 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

Теоретически, могу ли я просто скопировать и пропустить мой код в Unity, а не делать его автономным? У меня нет причин, чтобы он был автономным. –

+0

да действительно. Просто запустите его изнутри Единства. – Brandon

0

Кроме того, Если ваша единственная проблема заключается в debug.log() бросает исключение, вы можете использовать отражение посадить свой собственный экземпляр Logger вместо одного Юнити.

Шаг 1: Создайте «MyLogHandler», который будет выполнять фактическое ведение журнала (запись в файл или консоли или ничего не делать). Вашему классу необходимо реализовать интерфейс «ILogHandler».

Шаг 2: Заменить единство по умолчанию одним новым.

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

Примечание: Имейте в виду, что отражение обращается поле по имени, и если Unity решит изменить его в будущем, вы не получите сообщение об ошибке компиляции - исключение будет генерироваться в реальном времени.