简体   繁体   中英

How to pass List<int> from C# to C++ CLi?

I am beginner in C language family...

So, problem is - in my solution I have a repo (wrote in C#) that store List<int> , also I have an engine that (wrote in C++). So, I need pass List from C# implementation to C++ CLI for executing...

As far as I understood problem is C++ know how to work with std::vector and C# know how to work with List and I need somehow convert List to vector...

How to do it?

Any assumption appropriate.

EDIT

Sorry for misunderstanding, but my CLI works as a mapper for pure C++ implementation. So, as far as I understood from C# I need to pass my List to C++ CLI , C++ CLI will convert a List to vector and invoke another C++ file with pure C++ implementation.

This is my solution

h file using namespace System; using namespace 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 file

#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;
}
}

Error

在此输入图像描述

What am I doind wrong?

C++ CLI directly supports List and you don't need a conversion. Here is a typical signature.

private: System::Void FooMethod( System::Collections::Generic::List<Int32>^ list )

Besides, In your updated question, you have a linker error.

Open C++ project properties, Find Linker and then Input. Add the location to your (EngineLib_Cli.dll) Library there

Also I found more optimized solution

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);
}

By steps

1) you need to create your vector 2) hold this memory in heap 3) just copy the data

It is going to be much more faster

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM