Ho una funzione C++ che produce un elenco di rettangoli che sono interessanti. Voglio essere in grado di estrarre questa lista dalla libreria C++ e tornare all'applicazione C# che la sta chiamando.Come è possibile eseguire il marshalling di un vettore <int> da una dll C++ a un'applicazione C#?
Finora, sto codificare i rettangoli in questo modo:
struct ImagePatch{
int xmin, xmax, ymin, ymax;
}
e quindi la codifica alcuni vettori:
void MyFunc(..., std::vector<int>& rectanglePoints){
std::vector<ImagePatch> patches; //this is filled with rectangles
for(i = 0; i < patches.size(); i++){
rectanglePoints.push_back(patches[i].xmin);
rectanglePoints.push_back(patches[i].xmax);
rectanglePoints.push_back(patches[i].ymin);
rectanglePoints.push_back(patches[i].ymax);
}
}
L'intestazione per l'interazione con C# sembra (e lavora per un gruppo di altre funzioni):
extern "C" {
__declspec(dllexport) void __cdecl MyFunc(..., std::vector<int>& rectanglePoints);
}
Ci sono alcune parole chiave o altre cose che posso fare per ottenere quel set di rettangoli fuori? Ho trovato this article per il marshalling di oggetti in C#, ma sembra troppo complicato e troppo sottostimato. Un vettore di numeri interi è il modo giusto per farlo, o c'è qualche altro trucco o approccio?
Questo non è davvero "marshalling". Marshalling prenderebbe il tuo oggetto C++, scrivendo alcuni dati binari che lo rappresentano, e avendo C# leggere quei dati binari per costruire un oggetto corrispondente nell'altro ambiente. Stai provando a passare un argomento dal codice C# al codice C++ e il codice C++ lo modifica. –
OK, allora come posso fare in modo che quello che ottengo dal lato C++ sia di lunghezza arbitraria? – mmr
Bene, se vuoi evitare di scrivere un oggetto .NET "corretto" gestito in C++, come descritto in quell'articolo di MSDN, restituisci un buffer malloced da C++ (e liberalo da C# quando hai finito con esso); riprogettare la tua API in modo che C# possa passare in un buffer da riempire, e una lunghezza, e il codice C++ può in qualche modo dire a C# quanto deve essere grande quel buffer; ridisegnare l'API in modo da richiamare da C++ in C# una volta per ogni valore e aggiungerla a una raccolta C#. Non ne so abbastanza di C# (o di interfaccia con altre lingue da C#) per giudicare quale sia più facile/migliore. –