2013-12-26 1 views
1

У меня есть некоторые третья партия IOS Статическая библиотека, которая имеет .h файлы, содержащие const struct:Доступ к структуре Objective-C от MonoTouch при связывании с IOS статической библиотеки

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 прошивкой Связывание проекта

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

}; 


[Static] 
public interface SomeInterface 
{ 

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

Я включил 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; 

Итак, может кто-то, пожалуйста, помогите мне в этом.

Заранее спасибо.

+0

@dasblinkenlight Спасибо за редактирование. – user3124624

ответ

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)); 
     } 
    } 
+0

Не могли бы вы рассказать мне, как получить доступ к структуре SomeStruct. – user3124624

+0

PtrToStructre сделает это. –

+0

Я использую PtrToStructure, но это забрасывало меня с ошибкой. – user3124624

Смежные вопросы