не поддерживается языком - PullRequest
0 голосов
/ 03 мая 2018

Я регулярно пишу код на C ++, и для конкретного проекта, над которым я сейчас работаю, я пишу C ++ lib, чьи методы должны использоваться в C # lib, чьи методы должны использоваться в приложении C # .

Я использую Microsoft Visual Studio 2017 в Windows 10.

Я создал решение с 3 проектами:

  1. Динамическая библиотека C ++ / CLI (New Project => Visual C++ => CLR => Class Library)
  2. A C # lib (New Project => Windows Classic Desktop => Class Library (.NET Framework))
  3. И приложение на C # (New Project => Windows Classic Desktop => Console App (.NET Framework))

Пока я просто пытаюсь заставить эти 3 проекта взаимодействовать друг с другом, и у меня, похоже, есть проблемы между C ++ lib и C # lib.

Код в моей C ++ lib следующий:

cppLib.h

#pragma once
#include <string>

using std::string;

using namespace System;

namespace cppLib {
    public ref class cppClass
    {
    public:
        static string test();
        static double add(double arg1, double arg2);
    };
}

cppLib.cpp

#include "cppLib.h"

namespace cppLib {
    string cppClass::test() {
        return "Hello World from C++ lib.";
    }

    double cppClass::add(double arg1, double arg2) {
        return arg1 + arg2;
    }
}

Код в моей C # lib следующий:

Wrapper.cs

using cppLib;

namespace CsWrapper
{
    public class Wrapper
    {
        //static public string TestCppLib()
        //{
        //    return cppClass.test();
        //}

        static public double Add(double arg1, double arg2)
        {
            return cppClass.add(arg1, arg2);
        }

        public string WrapperTest()
        {
            return "Hello World from C# lib.";
        }
    }
}

Как есть, этот код создается без ошибок и предупреждений. Поэтому я могу вызывать мой static double add(double arg1, double arg2); метод из моей библиотеки C ++ в моем методе C # lib static public double Add(double arg1, double arg2), НО, если я попытаюсь раскомментировать следующий код в Wrapper.cs :

        //static public string TestCppLib()
        //{
        //    return cppClass.test();
        //}

Я получаю сообщение об ошибке 'cppClass.test(?)' is not supported by the language:

Severity    Code        Description                                             Project     File                                        Suppression State
Error       CS0570      'cppClass.test(?)' is not supported by the language     CsWrapper   D:\documents\...\CsWrapper\Wrapper.cs       Active

Что это значит? Как я могу без проблем вызвать один метод из моей библиотеки C ++ в моей библиотеке C #, а другой - нет? Мой метод public string WrapperTest() возвращает строку, которую я могу использовать в своем приложении C # (она работает, я могу отобразить ее), так почему я не могу вызвать этот конкретный метод C ++ в моей C # lib? Это также действительно мой первый раз кодирование на C #.

1 Ответ

0 голосов
/ 07 мая 2018

В C ++ / CLI строка не может быть возвращена как собственный тип шаблона C ++, если метод должен использоваться приложением C # / lib, потому что код C # не знает, как его использовать.

Должен использоваться управляемый (вариант .Net) типа; для C ++ string это String^. ^ указывает, что это указатель класса ref (управляемый).

Код становится:

cppLib.h

#pragma once
#include <string>

using std::string;

using namespace System;

namespace cppLib {
    public ref class cppClass
    {
    public:
        static String^ test();
        static double add(double arg1, double arg2);
    };
}

cppLib.cpp

#include "cppLib.h"

namespace cppLib {
    String^ cppClass::test() {
        return "Hello World from C++ lib.";
    }

    double cppClass::add(double arg1, double arg2) {
        return arg1 + arg2;
    }
}

Остальное остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...