我从 C++ DLL 收到一个IntPtr
(代表一个char*
),我想在 C# 中将其转换为字符串。是否Span<char>.ToString
始终生成新的字符串实例,或者是否有办法避免在从转换时创建新字符串IntPtr
?任何建议都将不胜感激!
此外,生成的字符串将绑定到 WinUI 3 XAML 中的属性。
// Simulate a char* received from C++
String original = "Hello";
IntPtr ptr = Marshal.StringToHGlobalUni(original); // Allocate as UTF-16 (char*)
try
{
// Convert IntPtr to Span<char> and then to String
Span<char> span = new Span<char>(ptr.ToPointer(), original.Length);
String result = span.ToString();
}
finally
{
Marshal.FreeHGlobal(ptr);
}
如果您的 C++ 代码生成了大量重复的字符串,您可以
string.Intern()
删除它们以节省内存。但我不认为这是您要问的。从任何类型的内存缓冲区创建
string
都需要分配该字符串的副本。使用Span<char>
来帮助跟踪内存缓冲区不会增加任何开销,因为跨度只能存在于堆栈中,并且实际上只包含指针和长度。由于
string
应该是不可变的,因此运行时必须保证内存缓冲区不会被保存内存地址副本的某些恶意 C++ 代码操纵。虽然你可以用unsafe
代码打破这条规则,但我不建议这样做。如果内存分配导致了严重的性能问题,那么您可能应该
string
完全避免使用。