Xcode 静态库中断生成

Xcode 静态库中断生成,xcode,mono,xamarin.ios,pinvoke,static-libraries,Xcode,Mono,Xamarin.ios,Pinvoke,Static Libraries,我在xcode中编译了一个针对“iOS设备”的静态库,并将其链接到一个monotouch应用程序。当我构建并运行应用程序时,我立即收到一个错误: Mono.Debugger.Soft.VMDisconnectedException:类型的异常 引发了“Mono.Debugger.Soft.VMDisconnectedException”。在 Mono.Debugger.Soft.Connection.SendReceive(命令集命令集, Int32命令,Mono.Debugger.Soft.P

我在xcode中编译了一个针对“iOS设备”的静态库,并将其链接到一个monotouch应用程序。当我构建并运行应用程序时,我立即收到一个错误:

Mono.Debugger.Soft.VMDisconnectedException:类型的异常 引发了“Mono.Debugger.Soft.VMDisconnectedException”。在 Mono.Debugger.Soft.Connection.SendReceive(命令集命令集, Int32命令,Mono.Debugger.Soft.PacketWriter包)[0x00000]位于 :0位于Mono.Debugger.Soft.Connection.VM\u GetVersion ()[0x00000]英寸:0英寸 Mono.Debugger.Soft.Connection.Connect()[0x00000]位于:0中的Mono.Debugger.Soft.VirtualMachine.Connect() [0x00000]英寸:0英寸 Mono.Debugger.Soft.VirtualMachineManager.listenternal (System.Net.Sockets.Socket dbg_sock,System.Net.Sockets.Socket con_sock)[0x00000]英寸:0

并且没有应用程序输出。我是否对库签名似乎并不重要,我已经尝试了各种版本和构建设置,甚至在编译器之间切换(我使用的最后一个编译器是股票GCC4.2编译器)。Whm

当我为模拟器构建库并将其链接到应用程序以在设备上运行时,它实际上在设备上运行,但一旦p/调用某个函数,应用程序就会退出,我会得到系统输出,说明pinvoke无法解决

它没有运行的原因可能是由于构建设置或其他原因,因为它在模拟器上运行,这可能是JIT与AOT的问题。”

编辑:

这是事情的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;
};
extern“C”
int CreateWorld(b2Vec2重力,布尔(*起始触点)(触点),布尔(*结束触点)(触点))
//联系struct以匹配C#代码中的MyCollisionEvent
类型定义结构
{
b2Body*bodyA;
b2Body*bodyB;
}接触;
///二维列向量。
结构b2Vec2
{
///默认构造函数不做任何事情(为了性能)。
b2Vec2(){}
///使用坐标构造。
b2Vec2(float32x,float32y):x(x),y(y){
///将此向量设置为全零。
void SetZero(){x=0.0f;y=0.0f;}
///将此向量设置为某些指定的坐标。
空集(float32 x_u2;,float32 y_2;{x=x_2;;y=y_2;}
///对这个向量求反。
b2Vec2运算符-()常量{b2vec2v;v.Set(-x,-y);返回v;}
///读取并索引元素。
float32运算符()(int32 i)常量
{
返回(&x)[i];
}
///写入索引元素。
float32&运算符()(int32 i)
{
返回(&x)[i];
}
///向该向量添加一个向量。
无效运算符+=(常量b2Vec2&v)
{
x+=v.x;y+=v.y;
}
///从这个向量中减去一个向量。
无效运算符-=(常量b2Vec2&v)
{
x-=v.x;y-=v.y;
}
///将这个向量乘以一个标量。
无效运算符*=(浮点32 a)
{
x*=a;y*=a;
}
///获取此向量的长度(范数)。
float32长度()常量
{
返回b2Sqrt(x*x+y*y);
}
///得到长度的平方。为了提高性能,请使用此值而不是
///b2Vec2::长度(如果可能)。
float32长度平方()常数
{
返回x*x+y*y;
}
///将此向量转换为单位向量。返回长度。
float32规范化()
{
float32长度=长度();
if(长度
编辑2:

我第一次写这篇文章的时候就应该提到这一点,但我已经在设备上运行了好几次了。通常,它涉及使用稍微不同的构建设置(例如对库签名)重新构建项目/库,但我无法识别导致这些成功构建的需要采取的步骤


每次运行时,它都会崩溃(由于不相关的bug),但即使是对代码的轻微修改(例如注释一行),也会再次出现相同的错误。即使恢复线路也不能消除错误。

我看不到任何明显的错误。尝试一种分而治之的方法,即

  • 使用任何方法参数删除代码;然后
  • 删除一个(一个接一个)参数(例如,首先删除b2Vec2,然后删除回调…)

直到你到达一个(牢固的,永不崩溃的)工作点。这将产生一个更小的测试用例来检查:)

在经历了很多痛苦之后,我决定在iPhone上进行iOS的干净安装,并修复了错误。我仍然不太确定是什么原因导致了这些错误,但由于一个干净的iOS安装修复了它,我只能假设它与以前的安装有关,并且希望它非常特定于那个安装

您可以编辑您的帖子,使其在C#(包括属性)和C中都包含p/invoke签名吗?谢谢你。这是被调用的特定函数(也是第一个被pinked的函数)。如果库是为模拟器构建的,我不确定它是否应该在设备上工作。请还包括非基本类型的托管/本机定义,例如b2Vec2、Contact、OnisContact和ContactOver。您的随机崩溃很可能是由于在托管/本机表示不匹配时错误处理堆栈造成的。好的,我想这就是所有相关代码:)好的,我只是再次尝试删除所有外部“C”函数和试图调用这些外部“C”函数的C#函数。只需将库链接到中,而无需在代码中的任何位置调用库中的任何函数。我还是有同样的问题。我确实发现,如果我重建lib并将其拖动到链接的现有lib上,然后重建整个解决方案,编译和运行应用程序将实际运行,但随后它将同时运行