2009-08-13 4 views
0

Je crée un assembly COM .net appelable et essaye maintenant de l'utiliser à partir de clients COM hérités (client VB6 dans mon cas).Assemblage d'un tableau de type défini par l'utilisateur entre VB6 et .net

Assemblée devrait exposer l'interface de style API, déclaration de fonction typique ressemblerait à ceci:

int myRoutine (object inParam, out object result); 

Le problème est quand je tente d'utiliser la fonction déclarée comme:

int GetMultipleItems (out ItemData[] itemList); 

En VB6 cela se traduit par fonctionner avec un tableau à passer en paramètre qui échoue lorsque je l'appelle avec 'appel ou argument de procédure invalide'.

appel réel ressemble:

Dim items() As ItemData 
result = SCServer.GetMultipleItems (items) 

objet d'une enquête plus loin, j'ai essayé plusieurs façons différentes de marquer ma bibliothèque attributs MarshalAs. De mon point de vue, le problème est que l'argument doit être un tableau à transmettre et - d'autre part - une variante à renvoyer au code VB.

Après plusieurs expériences, je me suis suit au travail (1):

int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray, 
    SafeArraySubType = VarEnum.VT_DISPATCH)]out object[] itemList); 

(ayant des éléments() déclarés comme objet du côté client).

Mais je dois utiliser exactement ma signature initiale (2),

int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray, 
    SafeArraySubType = VarEnum.VT_DISPATCH)]out ItemData[] itemList); 

Ce qui ne fonctionne pas non plus avec l'objet ou avec déclaration de type tableau ItemData au client. Donc, les questions sont les suivantes:
- pourquoi (1) fonctionne alors que (2) ne fonctionne pas. Que dois-je changer dans la déclaration d'attribut ou dans le client pour travailler avec mon type réel dans la signature (il expose une interface qui a été exportée vers tlb, donc tout devrait être OK ici)
- ce qui est recommandé définir sugh [out] paramètres tableaux
- peut-être que je manque de lecture essentielle, je serais reconnaissant pour les liens ... encore je dois obtenir l'échantillon de travail dans un jour ou deux.

Merci d'avance.

Répondre

0

Pourriez-vous modifier votre action de déclaration afin que vous retourniez le tableau d'objets et que le client puisse récupérer le nombre de ceux-ci à partir de ce qui est retourné.

ItemData[] GetMultipleItems() 

dans votre méthode, vous pouvez soit renvoyer la valeur null ou un tableau vide (longueur == 0) s'il n'y en a pas.

ou d'avoir votre tableau retourné et une variable définie avec le nombre.

ItemData[] GetMultipleItems(out int ItemsReturned) 

Les déclarations de style WinAPI ne sont pas vraiment la méthode normale pour déclarer des méthodes etc. dans les API .NET. (mais je peux me tromper bien sûr).

+0

Je considère ceci comme option. Non mentionné en question - la valeur de retour n'est pas vraiment le nombre d'éléments, il contient une erreur pour l'opération. Votre suggestion pourrait encore être utile s'il n'y a pas d'autre moyen –

Questions connexes