2015-06-09 11 views
7

Khi chạy chương trình này, tôi tiếp tục nhận được lỗi: Ngoại lệ không được loại trừ của 'System.Security.SecurityException' xảy ra Thông tin bổ sung: Phương pháp ECall phải được đóng gói thành mô-đun hệ thống.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(); 
     } 
    } 

Làm cách nào để khắc phục sự cố này?

Phần quan trọng của thư viện Brekel là như sau:

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

Không quen thuộc với thư viện TCP Brekel này. Có một liên kết? Nó làm gì? –

+0

Đó là khá dài, nhưng ý tưởng là để nắm bắt dữ liệu xương từ Microsoft Kinect, dòng dữ liệu ngay lập tức khi ai đó đang di chuyển trong lĩnh vực Kinects xem, và sau đó đóng kết nối tcpip giữa phần mềm Brekel và visual studio. Tôi sẽ dán thư viện vào một bình luận dưới đây trong trường hợp bạn muốn xem nó. –

+1

có thể trùng lặp (hoặc chỉ một câu hỏi liên quan) của http://stackoverflow.com/questions/11286004/securityexception-ecall-methods-must-be-packaged-into-a-system-module –

Trả lời

18

Có vẻ bạn đang sử dụng một thư viện Unity nhưng cố gắng để chạy nó như một ứng dụng độc lập?

Lỗi này có nghĩa là bạn đang gọi một phương thức được triển khai trong công cụ Unity. Bạn chỉ có thể sử dụng thư viện từ bên trong Unity.

Nếu bạn muốn sử dụng nó độc lập, bạn sẽ cần phải biên dịch thư viện mà không tham khảo bất kỳ thư viện Unity, mà có lẽ có nghĩa là bạn sẽ cần cung cấp triển khai cho bất cứ điều gì thư viện đang sử dụng (ví dụ như 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

Về mặt lý thuyết, tôi có thể chép và dán mã của tôi vào Unity thay vì làm cho nó độc lập không? Tôi không có lý do gì mà nó cần phải độc lập. –

+0

có thực sự. Chỉ cần chạy nó từ bên trong Unity. – Brandon

0

Bên cạnh đó, Nếu vấn đề duy nhất của bạn là Debug.Log() ném một ngoại lệ, bạn có thể sử dụng phản ánh để trồng dụ Logger của riêng bạn thay vì một Unity của.

Bước 1: Tạo "MyLogHandler" sẽ ghi nhật ký thực tế của bạn (ghi vào tệp hoặc bảng điều khiển hoặc không làm gì cả). Lớp của bạn cần triển khai giao diện "ILogHandler".

Bước 2: Thay thế mặc định thống nhất bằng một cái mới.

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

Lưu ý: Hãy nhớ rằng phản ánh truy cập trường theo tên và nếu Unity quyết định thay đổi nó trong tương lai, bạn sẽ không nhận được biên dịch lỗi - ngoại lệ sẽ được ném vào thời gian chạy.