Tenho um IntPtr
(representando um char*
) recebido de uma DLL C++, e quero convertê-lo para uma string em C#. Está Span<char>.ToString
sempre gerando uma nova instância de string, ou há uma maneira de evitar criar uma nova string ao converter de IntPtr
? Qualquer conselho seria muito apreciado!
Além disso, a string resultante será vinculada a uma propriedade no 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);
}
Se seu código C++ estiver gerando muitas strings duplicadas, você pode
string.Intern()
usá-las para economizar memória. Mas não acho que seja isso que você está perguntando.Criar um
string
de qualquer tipo de buffer de memória exigirá que uma cópia dessa string seja alocada. Usar umSpan<char>
para ajudar a rastrear o buffer de memória não deve adicionar nenhuma sobrecarga, já que um span só pode existir na pilha e só contém realmente um ponteiro e um comprimento.Como
string
é suposto ser imutável, o tempo de execução deve garantir que o buffer de memória não possa ser manipulado por algum código C++ desonesto que manteve uma cópia do endereço de memória. Embora você possa quebrar essa regra comunsafe
código, eu não recomendaria.Se a alocação de memória estiver causando um problema significativo de desempenho, talvez você deva evitar usá
string
-lo.