Was ist die bewährte Möglichkeit, von char * zu System :: String und zurück in C++/CLI zu konvertieren? Ich habe ein paar Verweise auf marschall_to <> Vorlagenfunktionen auf Google gefunden, aber es scheint, dass diese Funktion nie den Schnitt für Visual Studio 2005 gemacht hat (und nicht in Visual Studio 2008, AFAIK). Ich habe auch Code auf Stan Lippman's blog gesehen, aber es ist von 2004. Ich habe auch Marshal :: StringToHGlobalAnsi() gesehen. Gibt es eine Methode, die als "best practice" gilt?Was ist die beste Methode zum Konvertieren zwischen char * und System :: String in C++/CLI
Antwort
Es gibt einen guten Überblick hier (die Marshalling-Unterstützung hinzugefügt für VS2008): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
Was wir getan haben, ist ein C++ \ CLI-Objekt, das die Zeichenfolge in nicht manipuliertem Code enthielt und veraltete Kopien des Elements ausgeben würde. Der Umwandlungscode sieht sehr ähnlich aus wie Stan auf seinem Blog (ich kann mich nicht genau daran erinnern) (Wenn Sie seinen Code verwenden, stellen Sie sicher, dass Sie ihn aktualisieren, um delete []) zu verwenden, aber wir haben sichergestellt, dass der Destruktor die Freigabe übernimmt die nicht gemanagten Elemente des Objekts. Dies ist ein wenig übertrieben, aber wir hatten keine Lücken, als wir uns in Legacy-C++ - Codemodule einklinkten.
System :: String hat einen Konstruktor, der ein Zeichen nimmt *:
using namespace system;
const char* charstr = "Hello, world!";
String^ clistr = gcnew String(charstr);
Console::WriteLine(clistr);
ein Zeichen bekommen * zurück ist ein bisschen härter, aber nicht so schlecht:
IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
char *pNewCharStr = static_cast<char*>(p.ToPointer());
cout << pNewCharStr << endl;
Marshal::FreeHGlobal(p);
+1, System :: String-Konstruktor dauert auch Länge und Codierung! –
'Marshal :: StringToHGlobalAnsi' ist eine schlechte Option im Vergleich zu' marshal_context' (wie von Matthew erwähnt), die RAII verwendet, um den Puffer automatisch zu befreien. Ganz zu schweigen davon, dass der Name völlig falsch ist, es gibt kein 'HGLOBAL' zurück. –
Ich habe ein paar Hilfsmethoden erstellt. Ich musste dies tun, um von einer alten Qt-Bibliothek zu CLI String zu wechseln. Wenn jemand das hinzufügen und mir sagen kann, ob es so aussieht, als ob ich ein Speicherleck hätte und was ich tun könnte, um es zu beheben, wäre ich sehr dankbar.
void MarshalString ( String^s, wstring& os) {
using namespace Runtime::InteropServices;
const wchar_t* char = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
os = char;
}
QString SystemStringToQt(System::String^ str)
{
wstring t;
MarshalString(str, t);
QString r = QString::fromUcs2((const ushort*)t.c_str());
return r;
}
Wahrscheinlich muss Marshal :: FreeHGlobal (IntPtr ((void *) Zeichen)); es –
@Pat ja Entschuldigung, ich sollte dies nach diesem Update aktualisiert haben. Ich habe es jetzt gut funktioniert. Durch die Umstellung auf .NET wurde die Leistung dieser App um das Dreifache gesteigert. Selbst Marshalling Dinge herum. – dko
Ein weiterer Link zu einer Übersicht über mögliche Wege:
- 1. Konvertieren von char-array zu System :: String^
- 2. Der beste Weg, um zwischen [Char] und [Word8] zu konvertieren?
- 3. Was ist System :: String-Konstruktorcodierung?
- 4. Unterschiede zwischen char * und String
- 5. Konvertieren eines seq [char] string
- 6. Konvertieren von "unsigned char *" in "char *" (und String)
- 7. Die beste Methode zum Konvertieren von Benutzereingaben in UTF-8
- 8. Was ist die beste Methode zum dynamischen Sandbox-Inline-JavaScript?
- 9. Unterschied zwischen char * str = "STRING" und char str [] = "STRING"?
- 10. Was ist die beste Methode zum Indizieren von eindeutigen Textfeldern?
- 11. Was ist die beste Methode zum Erstellen von ClickOnce-Bereitstellungen?
- 12. Was ist die beste Methode zum Aufräumen von CSS?
- 13. Was ist die beste Methode zum Speichern/Berechnen von Benutzerbewertungen?
- 14. Was ist die beste Methode zum Einstellen von Bildquellen?
- 15. konvertieren unsigned char * in String
- 16. Was ist die beste Methode zum Implementieren von Swiping zwischen Ansichten in OS X?
- 17. Wie char * zu einem System :: String^
- 18. Müssen String konvertieren^nach Char *
- 19. Die beste Methode zum Floaten?
- 20. PowerShell Char Charray in String konvertieren
- 21. Die beste Methode zum Verketten von String-Objekten?
- 22. Was ist die beste Methode, Veriable in Java zu definieren?
- 23. konvertieren MATLAB char-Array String
- 24. Was ist die beste Umbenennungsmethode?
- 25. System :: String zu char * und zurück in C++/CLI: Schneller als Marshal?
- 26. Was ist der beste Weg, Strukturdefinition in C und Golang
- 27. Was ist die beste Methode, um eine String-URL zu nehmen und zu codieren
- 28. Was ist die beste Methode zum Speichern von SASS generierten CSS in Ihrer Anwendung und Quellcodeverwaltung?
- 29. Converting System :: String zu Const Char *
- 30. Was ist der Unterschied zwischen [] String und ... String in Golang?
Danke, aber das ist eine lange Erklärung. Das geht mehr auf den Punkt: '#include // marshal_context context; // my_c_string = context.marshal_as (my_csharp_string); ' –
gatopeich
Für diejenigen, die sich wundern, ist der vollständige Namespace für Kontext' Msclr :: interop :: marschall_context' – Mugen