Mono С# PInvoke - получить CFString из внешней библиотеки

У меня есть библиотека, которая возвращает CFString, и я пытаюсь получить это строковое значение на С#. Проблема в том, что я не знаю, как это сделать на С#..

Заставить внешнюю функцию возвращать CFString не получится, так как она генерирует исключение «Тип MonoMac.CoreFoundation.CFString, который передается неуправляемому коду, должен иметь атрибут StructLayout».

Затем я подумал, что могу получить строку в виде массива байтов, а затем преобразовать ее в строку на С#, но у меня другая проблема, я не знаю, как преобразовать в C CFString в массив байтов:/

C# Dll Import stuff
[DllImport("lib")]
public static extern MonoMac.CoreFoundation.CFString  test();   

[DllImport("lib")]
public static extern byte[] test();     


C Library sample
CFStringRef test()
{
return CFSTR("test string");
}

Если кто-нибудь знает, как это сделать, пожалуйста, помогите мне;)

Спасибо


person BraCa    schedule 11.08.2011    source источник
comment
Каково соглашение о вызовах по умолчанию для Mono? Вы должны объявить его как в коде C, так и в C# и убедиться, что они совпадают.   -  person Security Hound    schedule 11.08.2011


Ответы (2)


Пытаться:

 [DllImport("lib")]
 public static extern IntPtr test();

Затем используйте:

 new CFString (test ()).ToString ();
person poupou    schedule 11.08.2011

  1. используя UnixMarshal.StringToHeap для преобразования строки в IntPtr.
  2. используя UnixMarshal.PtrToString для преобразования IntPtr в строку.
person Utmost    schedule 07.11.2012