我正在尝试用C
更有效的方法替换下面的代码:
void mstr2str(MonoString *mstr)
{
char *str = mono_string_to_utf8(mstr);
printf("mono string: %s\n", str);
g_free(str);
}
我的目标是避免 mono_string_to_utf8() 附带的内存分配和数据复制,因为 C# 返回到 C 的字符串可能非常大。
我已经阅读了有关使用 Windows C++ COM 接口的建议,但是在 Linux 下我尝试使用直接的方式来解决monostring
来自 C的问题。
下面的参考表明这是“不可能的”:
http://www.mono-project.com/Interop_with_Native_Libraries#marshal-step-4
“没有办法控制运行时如何分配封送内存,或者它持续多长时间。这是至关重要的。如果运行时封送字符串(例如 UTF-16 到 Ansi 转换),则封送的字符串只会持续调用。非托管代码不能保留对此内存的引用,因为它将在调用结束后被释放。不注意此限制可能导致“奇怪的行为”,包括内存访问冲突和进程死亡“。
但该主题后来在同一个文档中用Marshalling
、inPtr
和解决SafeHandles
(没有现成的示例,而参考博客来自 2004/2005)。
还有更多可用的最新文档或代码示例吗?
感谢您提供狼疮的解决方案。对于像我一样不懂 C# 的人来说,这些调用是定义在一个名为的文件中的宏object.h
,因此如果您动态加载运行时,它们会被报告为未解析的符号。他们来了:
#define mono_string_chars(s) ((gunichar2*)(s)->chars)
#define mono_string_length(s) ((s)->length)
似乎 C# 最终使用了指针。