Mono C # PInvoke - получает CFString из внешней библиотеки - PullRequest
2 голосов
/ 11 августа 2011

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

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

Тогда я подумал, что могу получить строку в виде байтового массива, а затем преобразовать ее в строку в C #, но затем у меня возникла другая проблема, я не знаю, как преобразовать в 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");
}

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

Спасибо

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Попробуйте:

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

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

 new CFString (test ()).ToString ();
1 голос
/ 11 августа 2011

Я думаю, ваш ответ может быть в одном из двух мест в этой статье:

http://msdn.microsoft.com/en-us/magazine/cc164123.aspx#S9

http://msdn.microsoft.com/en-us/magazine/cc164123.aspx#S3

0 голосов
/ 07 ноября 2012
  1. с использованием UnixMarshal.StringToHeap для преобразования строки в IntPtr.
  2. с использованием UnixMarshal.PtrToString для преобразования IntPtr в строку.
...