C ++ / CLI заставляет объекты класса «обертка» отображаться в C # - PullRequest
1 голос
/ 17 марта 2019

У меня работает этот учебник: https://www.red -gate.com / simple-talk / dotnet / net-development / creation-ccli-wrapper /

В этом учебнике используется 3 VisualСтудийные проекты в одном решении.Проект "Core" - это нативная сторона C ++.Проект Wrapper - это C ++ / CLI "мост".И проект «Песочница» - это сторона C #.

Сейчас я пытаюсь изменить это для работы с функцией C ++, которую я добавил в Core, но мои новые методы и свойства Wrapper не отображаются в C #,Моя конечная цель заключается в том, чтобы приложение C # отправляло текст в программу C ++, затем программа C ++ запрашивает базу данных и возвращает первые 20 записей, соответствующих тексту.Сейчас я просто хочу отправить классу C ++ строку и целое число, и чтобы он возвращал вектор строки, повторяемый целое число раз.

Я ожидал, что смогу создать новыйсвойство в оболочке, и он будет отображаться в C #.У меня есть свойство, указывающее на функцию в Core, и единственное существенное различие между рабочими свойствами / функциями и ошибочными - это используемые типы.В заголовочном файле проекта Wrapper я добавил свою функцию следующим образом:

void TypeAhead( std::string words, int count );

В файле Wrapper .cpp я добавил следующее:

void Entity::TypeAhead( std::string words, int count )
{
    Console::WriteLine( "The Wrapper is trying to call TypeAhead()!" );
    m_Instance->TypeAhead( words, count );
}

У меня есть соответствующие функции в Coreпроект.В Program.cs объект класса Entity может использовать свойства и функции из учебника, но не те, которые я добавил.Что мне нужно изменить, чтобы свойства и функции из проекта Wrapper можно было использовать в проекте Sandbox?

Мой репозиторий можно найти здесь: https://github.com/AdamJHowell/CLIExample

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Проблема в том, что std::string не является допустимым типом при попытке доступа к .NET. Это чистый зверь с ++.

Изменение:

void Entity::TypeAhead( std::string words, int count )
{
    Console::WriteLine( "The Wrapper is trying to call TypeAhead()!" );
    m_Instance->TypeAhead( words, count );
}

... для:

void Entity::TypeAhead( String^ words, int count )
{
    Console::WriteLine( "The Wrapper is trying to call TypeAhead()!" );

    // use your favourite technique to convert to std:string, this 
    // will be a lossy conversion.  Consider using std::wstring.
    std::string converted = // ...
    m_Instance->TypeAhead(converted, count );
}

Вместо этого используйте внутренне std :: wstring

Как указано в прекрасных комментариях Тома ниже, вы можете рассмотреть возможность использования wstring из-за возможной потери точности при преобразовании строк .NET в std::string. Для конвертации см. Ссылку ниже.

0 голосов
/ 17 марта 2019

Эта сигнатура функции несовместима с C #, поскольку она передает собственный тип C ++ по значению.

Подпись, которую вы ищете,

void TypeAhead( System::String^ words, int count );

и вам нужно преобразовать из .NET String в C ++ std :: string перед вызовом основной функции.

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