смешанное программирование для строки между C # управляемым кодом и C ++ неуправляемым кодом - PullRequest
2 голосов
/ 01 августа 2011

Я работаю над проектом c ++, который использует строковый путь для вызова файла XML. Когда я скомпилировал c ++, все работает отлично, и я могу использовать файл XML, как того требует мой проект.

Мне нужно было использовать C # GUI, поэтому я сделал обертку для вызова всех своих функций из моего файла C ++. Одна проблема возникает после отладки между обеими платформами, C # не распознает путь строки для вызова моего файла, ошибка, которую я получил, состоит в том, что он не может найти данный путь. Кто-нибудь знает, как отправить правильный путь строки между обеими платформами?

Спасибо заранее, Каролина

    int ClassUnmanaged::ReadFile(string path_to_file)
     {
        int status = XMLClass->ReadConfigFile(path_to_file);

        if(status)
        {
           return status; //Error
        }

        else
        {
           return 0;
        }
    }

Wrapper.h для класса C ++

    public __gc class Wrapper
    {

      public:   Wrapper(void);
      public:   ~Wrapper(void);
             /** Unmanaged pointer to Class Unmanaged API
               *    
               */
      private:  ClassUnmanaged__nogc* pointerUnmanaged;

          public: int NewReadfile(string path_to_file);
    }

Wrapper.cpp

    int Wrapper::NewReadFile(string path)
    {
        pointerUnmanaged->ReadFile(path);//here i access to my class unmanaged
    return 0;
     }

UI.cs

В UI.cs я не могу вызвать функцию NewReadfile из оболочки из-за строкового типа, который использует c ++. Есть идеи, как это решить?

1 Ответ

1 голос
/ 01 августа 2011

Вам нужно будет изменить метод NewReadFile на public и затем изменить его, чтобы он принимал в качестве входных данных тип, о котором C # знает как Sytem::String, он должен выглядеть следующим образом (используя новый управляемый синтаксис C ++, при необходимости адаптируясь к старому))

int Wrapper::NewReadFile(System::String^ path)
{
    char* pathAsCharArray = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
    try
    {
        std::string pathAsStdString(pathAsCharArray);
        pointerUnmanaged->ReadFile(pathAsStdString);
    }
    finally
    {
        Marshal::FreeHGlobal(pathUnmanaged);
    }

    return 0;
 }

Существует статья в КБ с именем "Как преобразовать из System :: String * в Char * в Visual C ++" , которая объясняет эту концепцию.Если ваш базовый API может поддерживать юникод, и вы используете новый синтаксис, лучший способ выполнить преобразование будет выглядеть примерно так:

pin_ptr<const wchar_t> pathAsCharArray = PtrToStringChars(path);
std::wstring pathAsStrign(pathAsCharArray);
...