Come si converte System :: String in std :: string in C++ .NET?C++ .NET converti System :: String in std :: string
risposta
C'è sintassi più pulito se si sta utilizzando una versione recente di .NET
#include "stdafx.h"
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
std::string standardString = context.marshal_as<std::string>(managedString);
return 0;
}
Questo ti dà anche una migliore pulizia di fronte alle eccezioni.
C'è un msdn article per varie altre conversioni
Si occupa anche della codifica da UTF-16 (.Net predefinito) a UTF-8 (std :: string)? – zak
stdString = toss(systemString);
static std::string toss(System::String^s)
{
// convert .NET System::String to std::string
const char* cstr = (const char*) (Marshal::StringToHGlobalAnsi(s)).ToPointer();
std::string sstr = cstr;
Marshal::FreeHGlobal(System::IntPtr((void*)cstr));
return sstr;
}
Questa è la sintassi più vecchia. Preferisco quello che Colin ha suggerito sopra. – orad
Cosa succede se sstr() lancia? Non farebbe in modo che cstr diventi una perdita? –
e in risposta al "modo più semplice" nelle versioni successive di C++/CLI, è possibile farlo senza il marshal_context. So che questo funziona in Visual Studio 2010; Non sono sicuro di prima.
#include "stdafx.h"
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace msclr::interop;
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
std::string standardString = marshal_as<std::string>(managedString);
return 0;
}
Guarda l'articolo MSDN Collin collegato per vedere quando usare marshal_as e quando usare marshal_context. In generale, il marshal_context è necessario quando le risorse non gestite devono essere ripulite. – rotti2
L'articolo dice che è necessario un contesto solo se il tipo nativo non ha un distruttore per eseguire la sua pulizia. Quindi, nel caso di 'std :: string', è necessario? –
Il contesto non è necessario per 'std :: string'. Il contesto è necessario solo quando si effettua il marshalling da un tipo spostato a un tipo unwrapped (ovvero puntatore raw). Come elencato in [Panoramica di Marshalling in C++] (http://msdn.microsoft.com/en-us/library/bb384865.aspx), ci sono solo tre istanze in cui è necessario il contesto. –
ho avuto troppi errori ambigui che mostra il passo con le risposte di cui sopra (sì, io sono un C++ niubbo)
Questo ha funzionato per me per l'invio di stringa da C# per C++ CLI
C#
bool result;
result = mps.Import(mpsToolName);
C++ CLI
funzione:
bool ManagedMPS::Import(System::String^ mpsToolNameTest)
std::string mpsToolName;
mpsToolName = toStandardString(mpsToolNameTest);
funzione che lavora dalla conversione String^a std :: string
static std::string toStandardString(System::String^ string)
{
using System::Runtime::InteropServices::Marshal;
System::IntPtr pointer = Marshal::StringToHGlobalAnsi(string);
char* charPointer = reinterpret_cast<char*>(pointer.ToPointer());
std::string returnString(charPointer, string->Length);
Marshal::FreeHGlobal(pointer);
return returnString;
}
ON ulteriori ricerche, sembra che questo è più pulito e più sicuro.
Ho scelto invece di utilizzare questo metodo.
std::string Utils::ToUnmanagedString(String^ stringIncoming)
{
std::string unmanagedString = marshal_as<std::string>(stringIncoming);
return unmanagedString;
}
Quindi, come è riuscito a eliminare tutti gli errori di ambiguità di IServiceProvider? –
Non ricordo di aver ricevuto quegli errori. Ero nuovo al C++, ora sono su un altro contratto/progetto con società diversa .... mi dispiace soprattutto. –
Creazione di un runtime componenti di Windows è possibile utilizzare:
String^ systemString = "Hello";
std::wstring ws1(systemString ->Data());
std::string standardString(ws1.begin(), ws1.end());
C# utilizza il formato UTF16 per le sue corde.
Quindi, oltre alla semplice conversione dei tipi, è necessario essere consapevoli del formato effettivo della stringa.
Durante la compilazione per Set di caratteri multibyte Visual Studio e l'API Win presuppongono UTF8 (In realtà la codifica di Windows che è Windows-28591).
Durante la compilazione per Set di caratteri Unicode Visual Studio e l'API Win assumono UTF16.
Quindi, è necessario convertire anche la stringa da UTF16 a UTF8 e non solo convertire in std :: string.
Questo diventerà necessario quando si lavora con formati a più caratteri come alcune lingue non latine.
L'idea è quella di decidere che std::wstring
sempre rappresenta UTF16.
E std::string
sempre rappresenta UTF8.
Questo non è applicato dal compilatore, è più una buona politica da avere.
#include "stdafx.h"
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
//Actual format is UTF16, so represent as wstring
std::wstring utf16NativeString = context.marshal_as<std::wstring>(managedString);
//C++11 format converter
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
//convert to UTF8 and std::string
std::string utf8NativeString = convert.to_bytes(utf16NativeString);
return 0;
}
o fa in una sintassi più compatta:
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::string utf8NativeString = convert.to_bytes(context.marshal_as<std::wstring>(managedString));
return 0;
}
- 1. Come trasformare System :: String^in std :: string?
- 2. Converti float in std :: string in C++
- 3. C++/CLI Conversione da System :: String^a std :: string
- 4. Differenza tra std: string e std :: string
- 5. comprensione String^in C++ .Net
- 6. Cython C++ e std :: string
- 7. 'System :: String ^' a 'LPCWSTR'
- 8. C++ std :: string su booleano
- 9. Converti Short Array in String C#
- 10. Usando sprintf con std :: string in C++
- 11. Ottieni byte da std :: string in C++
- 12. SWIG: come avvolgere std :: string & (std :: string passato per riferimento)
- 13. std :: vector <std::string> crash
- 14. Converti XmlDocument per String
- 15. Perché non è std :: string :: max_size() == std :: string :: allocator :: max_size()
- 16. Converti DateTime in String PHP
- 17. Converti JSON String a JSON oggetto C#
- 18. C# Converti lista <string> nel dizionario <string, string>
- 19. C++ È uno std :: string un contenitore?
- 20. convertire std :: string in basic_ostream?
- 21. Ottieni il tipo da std :: string, C++
- 22. C++ 11 rappresentazione std :: string interna (libstdC++)
- 23. std :: string x (x);
- 24. std :: string a LPCTSTR
- 25. C++ Comportamento errato dell'inizializzazione std :: string
- 26. C# Array - string [] [] vs string [,]
- 27. Riutilizza uno std :: string spostato?
- 28. prestazioni std :: strstr vs. std :: string :: trovare
- 29. std :: string :: assign() causa segfault
- 30. std :: string :: c_str() e provvisori
Non. Converti in std :: wstring. System.String è Unicode, non ASCII – MSalters
@MSalters Huh? Sembra che tu abbia l'impressione che la conversione non includa la traduzione o che tutti possano sempre scegliere con quale API interagiranno ... –