Исключение Безопасности C#
при запуске этой программы я продолжаю получать ошибки: Необработанное исключение типа System.Безопасность.Исключение securityexception' произошло Дополнительная информация: методы ECall должны быть упакованы в системный модуль.
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;
}
}
}
3 ответов
похоже, вы используете библиотеку Unity, но пытаетесь запустить ее как отдельное приложение?
эта ошибка означает, что вы вызываете метод, реализованный в Unity engine. Вы можете использовать библиотеку только из Unity.
Если вы хотите использовать его автономно, вам нужно будет скомпилировать библиотеку без ссылки на какие-либо библиотеки Unity, что, вероятно, означает, что вам нужно будет предоставить реализации для всего, что использует библиотека (например, MonoBehaviour
http://forum.unity3d.com/threads/c-error-ecall-methods-must-be-packaged-into-a-system-module.199361/
дополнительно, Если ваша единственная проблема-отладка.Log () бросая исключение, вы можете использовать отражение для установки собственного экземпляра Logger вместо Unity.
Шаг 1: создать "MyLogHandler", который будет делать ваш фактический журнал(запись в файл или в консоль или ничего не делать). Ваш класс должен реализовать интерфейс" ILogHandler".
Шаг 2: заменить unity default one на новый.
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 решит изменить его в будущем, вы не получите ошибку компиляции - исключение будет выдано во время выполнения.
вы можете писать тесты в Unity, открыв и используя Unity Test runner его можно открыть, перейдя в windows и нажав test runner. Затем нажмите create editmode test и напишите свои тесты в файле, который сделан.
https://docs.unity3d.com/Manual/testing-editortestsrunner.html
таким образом, вам не нужно опускать использование библиотек unity.