Question

J'ai une méthode en .NET (C #) qui renvoie chaîne [] [] . Lors de l’utilisation de RegAsm ou de TlbExp (à partir du Kit de développement .NET 2.0 SDK) pour créer une bibliothèque de types COM pour l’assembly contenant, l’avertissement suivant apparaît:

  

AVERTISSEMENT: il n'y a pas de support de marshaling pour les tableaux imbriqués.

Cet avertissement a pour résultat que la méthode en question n'est pas exportée dans la bibliothèque de types générée. On m'a dit qu'il y avait moyen de contourner cela en utilisant Variant comme type de retour COM, puis en convertissant / etc du côté du client COM. Pour cet assemblage particulier, le public client cible est VB6. Mais comment procédez-vous réellement du côté de .NET?

Remarque : j'ai une DLL existante (avec sa bibliothèque de types exportée) où le type de retour est Variant, mais cette DLL (et le fichier .tlb) est générée à l'aide des outils pré-.NET existants. donc je ne peux pas les utiliser.

Est-ce que cela aiderait si l'assemblage était écrit en VB.NET à la place?

Était-ce utile?

La solution

Même si vous deviez renvoyer un objet (qui correspond à un variant dans COM Interop), cela ne résoudra pas votre problème. VB sera en mesure de "tenir" & et le "faire circuler", mais il ne pourra rien faire avec.

Techniquement, il n’existe pas d’équivalent exact en VB d’une chaîne [] []. Toutefois, si votre tableau n’est pas "irrégulier". (c’est-à-dire que tous les sous-tableaux ont la même longueur), vous devriez pouvoir utiliser un tableau à deux dimensions comme type de retour. COM Interop devrait pouvoir traduire cela.

string [,] myReturnValue = new string[rowCount,colCount];

Que votre méthode retourne formellement un objet (qui ressemblera à un variant à VB), ou une chaîne [,] (qui ressemblera à un tableau de chaînes dans VB), est quelque peu immatériel. Le tableau String est un retour plus agréable, mais pas obligatoire.

Si votre tableau est en dents de scie, vous devrez alors utiliser une méthode différente. Par exemple, vous pouvez choisir de rendre votre tableau 2D renvoyé aussi grand que le plus grand des sous-tableaux, puis de transmettre les informations de longueur dans un paramètre séparé [out] int [], afin que VB puisse savoir quels éléments sont utilisés.

Autres conseils

L'équivalent de la variante en C # est System.Object. Donc, vous voudrez peut-être essayer de renvoyer le résultat obtenu sous forme d'objet et de le récupérer de l'autre côté en tant que variante.

VB ne dispose pas d’installations qui manquent à C #, je doute donc que ce serait mieux ou plus facile si le côté .NET était écrit en VB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top