2009-11-06 8 views
6

J'ai ajouté 3 paramètres booléens optionnels à une méthode trouvée dans une DLL VB6. La classe qui l'héberge est MultiUse (public), et la méthode elle-même est Private. La classe implémente une interface spécifique à partir d'un TLB, permettant des appels publics à cette méthode.Est-il possible que C# ait des problèmes pour appeler les méthodes VB6 qui ont des paramètres optionnels?

Après avoir ajouté les 3 paramètres optionnels du côté VB6, j'ai modifié le code C# associé de façon à ce qu'il spécifie les 3 paramètres optionnels. Il construit bien ... Cependant, quand je tente d'exécuter ce code, il échoue avec le message d'erreur suivant:

Méthode non trouvée: « Boolean MyTLBName.IMyClassName.MyMethod (System.Object, système . String, Boolean, Boolean, Int32, Int32 ByRef, System.Object, System.Object, System.Object, Booléen, Booléen, Booléen) '.

Notez comment les 3 paramètres booléens sont affichés dans le message d'erreur? Ça me va bien ... Je sais que j'ai spécifié ces 3 booléens en appelant la méthode de C#.

Méfiant, j'ai vérifié l'interface MyTLBName.IMyClassName dans OLEView, et a vu ceci:

[id (0x60030000)]

HRESULT MyMethod(
       //Cut out the other parameters - they are working fine. 
       [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMyFirstOptionalBoolean, 
       [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMySecondOptionalBoolean, 
       [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMyThirdOptionalBoolean, 
       [out, retval] VARIANT_BOOL* __MIDL_0324); 

Encore une fois, les 3 paramètres optionnels sont visibles, et regardez bien .

Ça me semble que ça devrait marcher ... mais peut-être qu'il me manque quelque chose.

Y at-il un moyen de le faire fonctionner sans avoir à créer une autre version de "MyMethod" dans le TLB? (Avec un nom différent, et ces 3 paramètres si nécessaire plutôt qu'optionnel)

Répondre

5

Actuellement, C# a du mal à appeler les fonctions VB6 avec des paramètres facultatifs. Je me suis battu très dur avec celui-ci sur un projet où j'avais absolument besoin d'utiliser le composant VB6 fourni par un fournisseur externe.

J'ai trouvé que la solution la plus simple était de créer une classe en VB pour appeler ces fonctions, puisque VB.Net supporte les paramètres optionnels, puis appelle cette classe VB6 de C#.

Dans la classe écrite en VB.Net, j'ai suivi la méthode appropriée de surcharge pour fournir plusieurs méthodes pour appeler cette fonction VB6. Exemple - disons que la fonction VB6 a trois paramètres, le premier requis, et le second deux optionnel, je créerais trois fonctions dans le composant VB.Net.

Public Sub CallComponent(byVal myParameter as Integer) 
    ....call component with one parm 
End Sub 

Public Sub CallComponent(byVal myParameter as Integer, byVal parm2 as String,) 
    ....call component with two parms 
End Sub 

etc ...

Et il semble que les paramètres facultatifs sont à venir dans la version 4.0: http://geekswithblogs.net/michelotti/archive/2009/02/05/c-4.0-optional-parameters.aspx

+1

+1 Wow. Quelle douleur. –

+0

Je vais donner un coup de feu ... merci pour la pointe –

+0

Le lien de la république technologique est brisé. –

Questions connexes