ho implementato questo in C++ CLI wrapper. C++ CLI è uno dei tre possibili approcci per l'interoperabilità C++ C#. Gli altri due approcci sono P/Invoke e COM. (Ho visto alcune brave persone consigliare l'uso di C++ CLI rispetto agli altri approcci)
Per eseguire il marshalling delle informazioni dal codice nativo al codice gestito, è necessario prima avvolgere il codice nativo all'interno di una classe gestita C++ CLI. Crea un nuovo progetto per contenere il codice nativo e il suo wrapper C++ CLI. Assicurarsi di abilitare lo switch del compilatore /clr
per questo progetto. Costruisci questo progetto in una DLL. Per usare questa libreria, aggiungi semplicemente il suo riferimento all'interno di C# e fai chiamate contro di essa. Puoi farlo se entrambi i progetti sono nella stessa soluzione.
Ecco i file sorgente per un semplice programma per il marshalling di std::vector<double>
da codice nativo a codice gestito C#.
1) Progetto EntityLib (C++ CLI dll) (codice nativo con Wrapper)
File NativeEntity.h
#pragma once
#include <vector>
class NativeEntity {
private:
std::vector<double> myVec;
public:
NativeEntity();
std::vector<double> GetVec() { return myVec; }
};
File NativeEntity.cpp
#include "stdafx.h"
#include "NativeEntity.h"
NativeEntity::NativeEntity() {
myVec = { 33.654, 44.654, 55.654 , 121.54, 1234.453}; // Populate vector your way
}
File ManagedEntity .h (classe wrapper)
#pragma once
#include "NativeEntity.h"
#include <vector>
namespace EntityLibrary {
using namespace System;
public ref class ManagedEntity {
public:
ManagedEntity();
~ManagedEntity();
array<double> ^GetVec();
private:
NativeEntity* nativeObj; // Our native object is thus being wrapped
};
}
File ManagedEntity.cpp
#include "stdafx.h"
#include "ManagedEntity.h"
using namespace EntityLibrary;
using namespace System;
ManagedEntity::ManagedEntity() {
nativeObj = new NativeEntity();
}
ManagedEntity::~ManagedEntity() {
delete nativeObj;
}
array<double>^ ManagedEntity::GetVec()
{
std::vector<double> tempVec = nativeObj->GetVec();
const int SIZE = tempVec.size();
array<double> ^tempArr = gcnew array<double> (SIZE);
for (int i = 0; i < SIZE; i++)
{
tempArr[i] = tempVec[i];
}
return tempArr;
}
2) Progetto SimpleClient (C# exe)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EntityLibrary;
namespace SimpleClient {
class Program {
static void Main(string[] args) {
var entity = new ManagedEntity();
for (int i = 0; i < entity.GetVec().Length; i++)
Console.WriteLine(entity.GetVec()[i]);
}
}
}
fonte
2015-07-14 23:08:34
Così si vuole restituire il vettore fro la funzione? – deviantfan
Come mai in C++ la tua funzione restituisce 'void' ma in C# restituisce' int'? Inoltre, sembra che tu stia cercando di passare un vettore/array * da * C# * a * C++, e non viceversa (come afferma il tuo titolo). – Jashaszun
@deviantfan: si – nali