将非托管 NSString 复制到托管字符串

问题描述

我目前正在开发 NuGet 包,该包将使 .NET 开发人员在所有支持的平台上更容易使用特定硬件,因为目前除了 Windows 之外没有 .NET 接口。这些平台之一是 macOS。我有一个静态的 Objective-C++ 库,我设法将它包装到一个动态库 (dylib) 中,该库定义了 extern "C" 接口以防止名称修改(发生在静态库中)。我设法 P/Invoke 我需要的一切。我什至设法将一组结构复制到我的托管运行时。 我需要获取的最后一点信息是一些 Nsstring 对象 - 这就是我目前失败的地方。请注意,我删除错误处理代码以保持示例简洁。我还通过运行 nm -g libmylib.dylib

确保该符号确实存在

Objective-C++ 标头

extern Nsstring *FONT_CALIBRI;
extern Nsstring *FONT_TIMES_NEW_ROMAN;
extern Nsstring *FONT_CENTURY_GOTHIC;

extern Nsstring *FONT_SIZE_18PT;
extern Nsstring *FONT_SIZE_20PT;

尝试#1

C# 代码

dll = Dlfcn.dlopen("libmylib.dylib",0);
var sym = Dlfcn.dlsym(dll,"FONT_CALIBRI");
// The pointer is populated but this next call crashes in the managed code
var value = Marshal.PtrToStringAuto(sym);
Dlfcn.dlclose(dll);

尝试#2

C# 代码

dll = Dlfcn.dlopen("libmylib.dylib","FONT_CALIBRI");
// The pointer is populated but this next call crashes in the native code
var value = Nsstring.FromHandle(sym);
Dlfcn.dlclose(dll);

如果有人能指出我哪里出错了,我将不胜感激,如果您能提出解决方案,我将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...