我需要从Objective-C返回一个字符串集合到C#,但我无法正确地完成这一任务。当我在托管端打印返回的指针时,它的值是0。
目标c
FOUNDATION_EXPORT int _GetAllKeys(char** pointer)
{
NSArray* array = @[@"key1", @"key2"]; // dummy strings
int size = (int)array.count;
pointer = malloc(size * sizeof(char *));
for (int i = 0; i < size; i++)
{
pointer[i] = MakeStringCopy(array[i]);
}
return size;
}
字符串
C#语言
[DllImport("__Internal")]
private static extern int _GetAllKeys(out IntPtr buffer);
internal static IEnumerable<string> GetAllKeys()
{
int count = _GetAllKeys(out var buffer);
List<string> keys = new List<string>();
for (int i = 0; i < count; i++)
{
keys.Add(Marshal.PtrToStringUTF8(IntPtr.Add(buffer, IntPtr.Size))); //eventually when i make this work the strings will be returned as UTF8 but for now its not even making it to this line, so ignore the encoding.
}
return keys;
}
型
- 解决方案-
目标c
FOUNDATION_EXPORT int _GetAllKeys(char*** pointer)
{
NSArray* array = @[@"key1", @"key2"];
int size = (int)array.count;
*pointer = malloc(size * sizeof(char *));
for (int i = 0; i < size; i++)
{
(*pointer)[i] = MakeStringCopy(array[i]);
}
return size;
}
型
C#语言
[DllImport("__Internal")]
private static extern int _GetAllKeys(out IntPtr buffer);
internal static IEnumerable<string> GetAllKeys()
{
int count = _GetAllKeys(out var buffer);
List<string> keys = new List<string>();
for (int i = 0; i < count; i++)
{
IntPtr ptr = Marshal.ReadIntPtr(buffer);
keys.Add(Marshal.PtrToStringAuto(ptr));
buffer = IntPtr.Add(buffer, IntPtr.Size);
}
return keys;
}
型
1条答案
按热度按时间t98cgbkg1#
你试图返回一个char**,所以C函数的参数需要是一个char*:
字符串
C#代码看起来很好,除了IntPtr.Add返回一个新的IntPtr,所以它必须是:
型