8
votes

Comment tourner System :: String ^ En STD :: String?

Donc, je travaille dans CLR, Création de .NET DLL dans Visual C ++.

i TRU ce code: P>

#include <msclr\marshal.h>
#include <stdlib.h>
#include <string.h>
using namespace msclr::interop;
namespace NSSTW
{
  public ref class CFEW
  {
 public:
     CFEW() {}

     static System::String^ echo(System::String^ stringToReturn)
    {
        return stringToReturn;  
    }

     static bool InitFile(System::String^ fileName, System::String^ container)
    {   
        std::string sys_fileName = marshal_as<std::string>(fileName);;
        std::string sys_container = marshal_as<std::string>(container);;
        return enc.InitFile(sys_fileName, sys_container);
    }
...


2 commentaires

Vous avez inclus msclr \ marshal.h . Essayez msclr \ marshal_cppstd.h .


@Chris Schmich: Merci - Maintenant, il compile parfaitement =)


4 Réponses :


1
votes

Comment convertir de System :: String * sur Char * à Visual C ++

Une fois que vous avez un Char * , transmettez-le simplement sur le std :: string constructeur.


0 commentaires

8
votes

Si vous utilisez VS2008 ou plus récent, vous pouvez le faire très simplement avec le Marshaling automatique ajouté à C ++ . Par exemple, vous pouvez convertir de System :: string ^ sur std :: string via marshal_as : xxx

Il s'agit du même maréchalage utilisé pour les appels P / invoquer. < / p>


5 commentaires

J'aime l'idée mais comment déclarer marshal_as dans mon code? où et que dois-je écrire pour le déclarer (se débarrasser de l'erreur C2065), j'utilise vs2008


Pour aller de System :: string ^ à std :: string , vous devez #include Marshal_as est déclaré.


Quand j'essaye #include Cela me donne une erreur fatale C1083 ... donc j'ai édité le code et l'avez posté ici en question (j'utilise ce qu'ils utilisaient dans l'exemple de MSMS MSDN) ... Pouvez-vous y jeter un coup d'oeil s'il te plaît.


Désolé, j'étais légèrement éteint, vous devez inclure msclr \ marshal_cppstd.h . Avez-vous toujours ce problème? Votre code ci-dessus indique toujours msclr \ marshal.h .


msclr \ marshal.h va aussi bien. Merci btw. :)



4
votes

0 commentaires

3
votes

Vous devez inclure Marshal_cppstd.h pour convertir la chaîne ^ à stdd :: String.

Vous ne mentionnez pas si vous vous inquiétez du tout sur les caractères non-ASCII. Si vous avez besoin d'unicode (et sinon, pourquoi pas !?), il y a un maréhal_as qui retourne une STD :: wstring.

Si vous utilisez UTF8, vous devrez rouler le vôtre. Vous pouvez utiliser une boucle simple: xxx


0 commentaires