Я новичок в языковой семье C...
Итак, проблема в том, что в моем решении у меня есть репозиторий (написанный на C#), который хранит List<int>
, также у меня есть движок, который (написан на C++). Итак, мне нужно передать список из реализации С# в C++ CLI для выполнения...
Насколько я понял, проблема в том, что С++ знает, как работать с std::vector
, а С# знает, как работать с List
, и мне нужно как-то преобразовать список в вектор...
Как это сделать?
Любое предположение уместно.
РЕДАКТИРОВАТЬ
Извините за недопонимание, но мой CLI работает как картограф для реализации на чистом C++. Итак, насколько я понял из C#, мне нужно передать мой List
в C++ CLI, C++ CLI преобразует List
в vector
и вызовет другой файл C++ с чистой реализацией C++.
это мое решение
ч файл использование пространства имен System; с использованием пространства имен System::Collections::Generic;
//forward declaration
class MathCore;
namespace MathCore_CLI_namespace
{
public ref class MathCore_CLI
{
public:
MathCore_CLI();
~MathCore_CLI();
int computeMulPlusVals(List<int>^ list_first, List<int>^ list_second);
//int computeMulPlusVals(std::vector<int> vect_first, std::vector<int> vect_second);
private:
MathCore * m_pMathCore;
};
}
cpp-файл
#include "stdafx.h"
#include "MathCore_CLI.h"
#include "..\Engine\MathCore.h"
#include <iostream>
#include <array>
using namespace System;
using namespace System::Collections::Generic;
namespace MathCore_CLI_namespace
{
const int size = 5;
int count = 0;
int arrayVal[size];
MathCore_CLI::MathCore_CLI()
{
m_pMathCore = new MathCore();
}
MathCore_CLI::~MathCore_CLI()
{
delete m_pMathCore;
}
int computeMulPlusVals(List<int>^ list_first, List<int>^ list_second)
{
return 0;
}
}
Ошибка
Что я делаю неправильно?
C++ CLI напрямую поддерживает список, и вам не нужно преобразование. Вот типичная подпись.
private: System::Void FooMethod( System::Collections::Generic::List<Int32>^ list )
Кроме того, в вашем обновленном вопросе у вас есть ошибка компоновщика.
Откройте свойства проекта C++, найдите Linker, а затем введите Input. Добавьте местоположение в свою библиотеку (EngineLib_Cli.dll).
Вы не хотите ^
на Int32
, так как Int32
является типом значения
Также никто не пишет System::Void
кроме мастера нового проекта. Ключевое слово C++ void
будет работать нормально.
Извините за недопонимание. Отредактировал мой вопрос. Пожалуйста, взгляните
Также я нашел более оптимизированное решение
int MathCore_CLI::computeMulPlusVals(array<int>^ arr_first, array<int>^ arr_second)
{
auto vec_first = std::vector<int>(arr_first->Length);
cli::pin_ptr<int> pPinnedFirst = &arr_first[0];
memcpy(vec_first.data(), pPinnedFirst, arr_first->Length * sizeof(int));
auto vec_second = std::vector<int>(arr_second->Length);
cli::pin_ptr<int> pPinnedSecond = &arr_second[0];
memcpy(vec_second.data(), pPinnedSecond, arr_second->Length * sizeof(int));
return m_pMathCore->computeMulPlusVals(vec_first, vec_second);
}
По шагам
1) вам нужно создать свой вектор 2) держать эту память в куче 3) просто скопируйте данные
Это будет гораздо быстрее
Это основная ошибка «файл не найден». Используйте Build > Configuration Manager и убедитесь, что проект EngineLib_CLI действительно выбран для сборки. Остерегайтесь, что это выглядит подозрительно, не должно быть ни одного проекта, который имеет зависимость от этой DLL. Некоторая вероятность того, что проект, который не удалось собрать, является собственным проектом C++, который фактически создается с /clr, вы не хотите, чтобы это произошло.