在绑定到iOS静态库时从Monotouch访问Objective-C结构

时间:2013-12-26 13:15:59

标签: c# ios objective-c xamarin.ios xamarin

我有一些第三方iOS静态库,其中.h文件包含const struct

struct SomeStruct
{
    __unsafe_unretained NSString * const FirstName;
    __unsafe_unretained NSString * const SecondName;
    __unsafe_unretained NSString * const ThirdName;

};

extern const struct SomeStruct someName;

我将这个静态库绑定到MonoTouch,但我不明白如何在C#中复制它并从该结构访问字符串值。

在MonoTouch iOS绑定项目中

public struct SomeStruct
{
    public string FirstName;
    public string SecondName;
    public string ThirdName;

};


[Static]
public interface SomeInterface
{

    [Field ("SomeStruct", "__Internal")]
    IntPtr someNameStr { get; }
}

我在我的演示应用程序中包含了iOS绑定项目生成的dll

访问结构

    public static SomeStruct Name {
        get {
            if (SomeInterface.someNameStr != IntPtr.Zero) {
                return (SomeStruct)Marshal.PtrToStructure<SomeStruct> (SomeInterface.someNameStr);
            }
            return new SomeStruct ();
        }
    }

在这里,我可以获得正确的IntPtr。但我无法将其转换为结构并访问结构中的成员。

SomeInterface.Name.FirstName;

所以,有人可以帮我做这件事。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您希望使用Dlfcn中的方法来获取 someName 地址的地址。使用dlopen打开库并使用dlsym来获取地址。

然后你可以使用Marshal.PtrToStructure编组结果,但你必须确保值是IntPtr,如下所示:

public struct SomeStruct
{
    IntPtr _FirstName;
    IntPtr _SecondName;
    IntPtr _ThirdName;
};

要获取字符串,请执行以下操作:

    public string FirstName {
        get {
            return (string) (new NSString (_FirstName));
        }
    }