Я скомпилировал статическую библиотеку, предназначенную для iOS-устройства, в xcode и связал ее с приложением monotouch.Когда я собираю и запускаю приложение, я сразу же получаю сообщение об ошибке:
Mono.Debugger.Soft.VMDisconnectedException: исключение типа 'Mono.Debugger.Soft.VMDisconnectedException'.в Mono.Debugger.Soft.Connection.SendReceive (Command_set command_set, команда Int32, пакет Mono.Debugger.Soft.PacketWriter) [0x00000] в: 0 в Mono.Debugger.Soft.Connection.VM_GetVersion () [0x00000] в: 0в Mono.Debugger.Soft.Connection.Connect () [0x00000] в: 0 в Mono.Debugger.Soft.VirtualMachine.connect () [0x00000] в: 0 в Mono.Debugger.Soft.VirtualMachineManager.ListenInternal (System.Net.Sockets.Socket dbg_sock, System.Net.Sockets.Socket con_sock) [0x00000] in: 0
И вывод приложения отсутствует.Кажется, не имеет значения, подписываю я библиотеку или нет, я пробовал разные версии и настройки сборки, даже переключаясь между компиляторами (последний использованный компилятор был стандартным компилятором GCC 4.2).Whm
Когда я собираю библиотеку для симулятора и связываю ее с приложением для запуска на устройстве, она фактически запускается на устройстве, но как только вызывается функция, приложение закрывается, и я получаю системувывод, объясняющий pinvoke, не может быть разрешен.
Причина, по которой он не запускается, может быть из-за настроек сборки или чего-то еще, так как он запускается на симуляторе, это может быть проблемой JIT vs. AOT. '
edit:
Это сторона C # вещей:
[DllImport("__Internal")]
private static extern int CreateWorld(b2Vec2 grav, OnIOSContact startContact, ContactOver endContact);
delegate bool OnIOSContact(MyCollisionEvent ev);
delegate bool ContactOver(MyCollisionEvent ev);
[MonoTouch.MonoPInvokeCallback(typeof(OnIOSContact))]
static bool StatContactStart(MyCollisionEvent ev){...}
[MonoTouch.MonoPInvokeCallback(typeof(ContactOver))]
static bool StatContactEnd(MyCollisionEvent ev){...}
[StructLayout(LayoutKind.Sequential, Size=8),Serializable]
struct MyCollisionEvent
{
public IntPtr ActorA;
public IntPtr ActorB;
}
[StructLayout(LayoutKind.Sequential, Size=8),Serializable]
public struct b2Vec2
{
public b2Vec2(float _x, float _y)
{
x = _x;
y = _y;
}
public float x;
public float y;
}
и код C за ним:
extern "C"
int CreateWorld(b2Vec2 gravity, bool (*startContact)(Contact), bool (*endContact)(Contact))
//contact struct to match MyCollisionEvent in C# code
typedef struct
{
b2Body *bodyA;
b2Body *bodyB;
}Contact;
/// A 2D column vector.
struct b2Vec2
{
/// Default constructor does nothing (for performance).
b2Vec2() {}
/// Construct using coordinates.
b2Vec2(float32 x, float32 y) : x(x), y(y) {}
/// Set this vector to all zeros.
void SetZero() { x = 0.0f; y = 0.0f; }
/// Set this vector to some specified coordinates.
void Set(float32 x_, float32 y_) { x = x_; y = y_; }
/// Negate this vector.
b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; }
/// Read from and indexed element.
float32 operator () (int32 i) const
{
return (&x)[i];
}
/// Write to an indexed element.
float32& operator () (int32 i)
{
return (&x)[i];
}
/// Add a vector to this vector.
void operator += (const b2Vec2& v)
{
x += v.x; y += v.y;
}
/// Subtract a vector from this vector.
void operator -= (const b2Vec2& v)
{
x -= v.x; y -= v.y;
}
/// Multiply this vector by a scalar.
void operator *= (float32 a)
{
x *= a; y *= a;
}
/// Get the length of this vector (the norm).
float32 Length() const
{
return b2Sqrt(x * x + y * y);
}
/// Get the length squared. For performance, use this instead of
/// b2Vec2::Length (if possible).
float32 LengthSquared() const
{
return x * x + y * y;
}
/// Convert this vector into a unit vector. Returns the length.
float32 Normalize()
{
float32 length = Length();
if (length < b2_epsilon)
{
return 0.0f;
}
float32 invLength = 1.0f / length;
x *= invLength;
y *= invLength;
return length;
}
/// Does this vector contain finite coordinates?
bool IsValid() const
{
return b2IsValid(x) && b2IsValid(y);
}
float32 x, y;
};
Edit 2:
Я должен был упомянуть об этом, когда впервые написал пост, но мне удалось несколько раз запустить приложение на устройстве.Как правило, это включало пересоздание проекта / библиотеки с немного отличающимися настройками сборки (например, подписывание библиотеки), но я не смог разглядеть шаги, которые необходимо предпринять, что приводит к успешной сборке ...
Каждаякогда он запускался, он выходил из строя (из-за несвязанных ошибок), но даже небольшое изменение кода (например, комментирование строки) приводило к повторному появлению той же ошибки.Даже восстановление линии не устранит ошибку.