Lors de l’appel de l’interface du composant COM, nous utilisons généralement la méthode Type.InvokeMember(). Type.InvokeMember() doit accepter un tableau de type Object pour transmettre les informations sur les paramètres de l'interface lorsqu'elle est appelée. Pour les paramètres d'interface qui contiennent uniquement [in] ou ByVal, il vous suffit de construire un tel tableau et de le transmettre à Type.InvokeMember().
Si les paramètres d'interface du composant COM contiennent des paramètres de retour [out] ou [in, out] (ByRef dans les composants COM développés en VB), alors en plus de la méthode ci-dessus, un travail supplémentaire doit être effectué. Vous devez indiquer à Type.InvokeMember() quels paramètres dans les paramètres d'interface sont des paramètres [in][in,out] ou ByRef, sinon vous n'obtiendrez aucune valeur de paramètre de retour. Afin d'obtenir la valeur du paramètre de retour [in][in,out] ou ByRef, vous devez utiliser la méthode surchargée Type.InvokeMember() qui contient le tableau ParameterModifier.
Le tableau ParameterModifier ne doit contenir qu'un seul élément. L'objet ParameterModifier possède une propriété d'index appelée Item pour le paramètre appelant. Dans l'interface appelante, si le Nième paramètre est un paramètre de référence, alors la propriété Nth Item doit se voir attribuer la valeur true pour indiquer à Type.InvokeMember() qu'il s'agit d'un paramètre de référence.
Voici un exemple C# d'appel d'une interface COM avec trois paramètres (dont deux sont des paramètres de référence). Dans cet exemple, le deuxième paramètre et le troisième paramètre sont tous deux des paramètres de référence :
type ComObjType ;
objet ComObj;
string ReturnValue;
//Créer une référence à l'objet COM
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//Construit un tableau de paramètres pour l'appel à InvokeMethod et initialise chaque élément de paramètre
objet[] ParamArray = nouvel objet[3];
ParamArray [0] = "InParam" ;
ParamArray[1] = 5 ;
ParamArray[2] = "" ;
//Construisez le tableau ParameterModifier (notez qu'il n'y a qu'un seul élément dans le tableau ParameterModifier mentionné ci-dessus)
//Il y a trois paramètres ici. Par conséquent, lors de la création d'un objet ParameterModifier, vous devez indiquer le nombre de paramètres dans son constructeur.
//Utilisez l'attribut index du paramètre pour indiquer quel paramètre est un paramètre renvoyé
//Il n'est pas nécessaire de spécifier des paramètres [in] ou ByRef.
ParameterModifier[] ParamMods = nouveau ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3); // Initialisé au nombre de paramètres d'interface
ParamMods[0][1] = true; // Définit le deuxième paramètre comme paramètre de retour
ParamMods[0][2] = true; //Définit le troisième paramètre comme paramètre de retour
//Appelle la fonction surchargée contenant le tableau ParameterModifier
ReturnValue = (string) ComObjType.InvokeMember("ReturnSomeValues", //Nom de la fonction d'interface BindingFlags.Default | BindingFlags.InvokeMethod,
nul,
ComObj, // Le composant COM appelé ParamArray, // Tableau de paramètres ParamMods, // Tableau ParameterModifier spécifiant le paramètre de retour null,
null);
//Affiche la valeur du paramètre
Console.WriteLine ("Param1 = {0}", ParamArray[0]) ;
Console.WriteLine ("Param2 = {0}", ParamArray[1]) ;
Console.WriteLine ("Param3 = {0}", ParamArray[2]) ;
Console.WriteLine ("Return Value = {0}", ReturnValue ) ;
Notez que pour transmettre le tableau ParameterModifier correct à InvokeMethod(), vous devez initialiser le type de données du paramètre dans le tableau de paramètres qui accepte le retour. Dans l'exemple ci-dessus, le deuxième paramètre est un entier [5] et le troisième paramètre est un texte [''].