2009-11-13 4 views
3

J'ai un tableau de tableaux que je veux passer dans une DLL. Je cours dans l'erreur "Il n'y a pas de support de marshaling pour les tableaux imbriqués."Quel est un moyen sûr de passer un tableau de tableaux à une DLL en C#?

Je peux passer un seul tableau, mais si je les empile, il échoue. J'ai besoin/je veux un moyen "sûr" de passer dans le tableau de tableaux.

private static extern int PrintStuff(string[][] someStringsInGroups, int numberOfGroups, int[] lengthSetsInGroups); 

EDIT: Je suis prêt, avec assez de découragement et d'angoisse, d'accepter une solution impliquant marshaling.

Répondre

1

Vous pouvez convertir le double tableau en un seul tableau (c'est-à-dire l'aplatir). Cela peut être fait en gardant les variables de largeur et de hauteur, et accéder aux indices en tant que tels:

string atXY = someStringsInSingleArray[(y * width) + x]; 

Le tableau peut ensuite être converti en tant que tel:

string * array = new string[width * height]; 

for (unsigned int y = 0; y < height; ++y) 
{ 
    for (unsigned int x = 0; x < width; ++x) 
    { 
     array[(y * width) + x] = someStringsInGroups[x][y]; 
    } 
} 

// (pass single array to dll) 

delete [] array; 
+0

Pour généraliser cette idée, vous pouvez placer votre tableau 2D dans n'importe quelle forme sérialisable - comme un tableau 1D, ou même une chaîne. –

+0

J'ai déjà sérialisé certaines données dans un tableau int et j'ai même effectué un cast strut sur le côté C++ pour pouvoir lire ce que vous étiez en train d'assigner aux données (o [i] .value v.s. o [i] [7]). Quand une chaîne est passée dans une DLL, elle est marshalée avec un Null à la fin de celle-ci. Si je le sérialise moi-même, je devrai ajouter ceux-ci. Pas un gros problème, mais le code tel qu'il est rend les techniciens autour de moi mal à l'aise. L'autre exigence est que tout le code soit "sûr" en C#. Une autre solution serait de martialiser réellement les données manully :( – QueueHammer

0

Je viens de tombé sur ce qui peut ne pas être aussi sûr mais beaucoup plus rapide puisque seuls les pointeurs sont alloués.

http://www.mycsharp.de/wbb2/thread.php?threadid=82380

Il est en allemand, mais le code à la fin de la page est prête à copier/coller. Dans mon cas, j'ai juste fait de la classe générique non seulement pour supporter les doubles.

Rappelez-vous, je ne sais pas à propos de string [] [] puisque je suppose que la chaîne doit être convertie en char *, donc vous auriez char [] [] * plutôt que double [] [] comme dans l'exemple .

Questions connexes