Al llamar a la interfaz del componente COM, generalmente usamos el método Type.InvokeMember(). Type.InvokeMember() necesita aceptar una matriz de tipo Objeto para pasar la información de los parámetros de la interfaz cuando se llama. Para los parámetros de interfaz que solo contienen [in] o ByVal, solo necesita construir dicha matriz y pasarla a Type.InvokeMember().
Si los parámetros de interfaz del componente COM contienen parámetros de retorno [out] o [in, out] (ByRef en componentes COM desarrollados en VB), además del método anterior, se debe realizar algún trabajo adicional. Debe indicarle a Type.InvokeMember() qué parámetros en los parámetros de la interfaz son [in][in,out] o parámetros ByRef; de lo contrario, no obtendrá ningún valor de parámetro de retorno. Para obtener el valor del parámetro de retorno [in][in,out] o ByRef, debe utilizar el método sobrecargado Type.InvokeMember() que contiene la matriz ParameterModifier.
La matriz ParameterModifier solo necesita contener un elemento. El objeto ParameterModifier tiene una propiedad de índice llamada Item para el parámetro de llamada. En la interfaz de llamada, si el enésimo parámetro es un parámetro de referencia, entonces a la propiedad Nth Item se le debe asignar un valor verdadero para indicarle a Type.InvokeMember() que se trata de un parámetro de referencia.
El siguiente es un ejemplo de C# sobre cómo llamar a una interfaz COM con tres parámetros (dos de los cuales son parámetros de referencia). En este ejemplo, el segundo parámetro y el tercer parámetro son parámetros de referencia:
escriba ComObjType;
objeto ComObj;
string ReturnValue;
//Crea una referencia al objeto COM
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//Construye una matriz de parámetros para la llamada a InvokeMethod e inicializa cada elemento de parámetro
objeto[] ParamArray = nuevo objeto[3];
ParamArray [0] = "InParam";
MatrizParam[1] = 5;
ParamArray[2] = "" ;
// Construya la matriz ParameterModifier (tenga en cuenta que solo hay un elemento en la matriz ParameterModifier mencionada anteriormente)
//Aquí hay tres parámetros. Por tanto, al crear un objeto ParameterModifier, debes indicar el número de parámetros en su constructor.
//Utilice el atributo de índice del parámetro para indicar qué parámetro es un parámetro devuelto
//No es necesario especificar parámetros que sean [in] o ByRef.
ParameterModifier[] ParamMods = nuevo ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3); // Inicializado al número de parámetros de la interfaz.
ParamMods[0][1] = true; // Establece el segundo parámetro como parámetro de retorno;
ParamMods[0][2] = true; //Establece el tercer parámetro como parámetro de retorno;
//Llama a la función sobrecargada que contiene la matriz ParameterModifier
ReturnValue = (cadena) ComObjType.InvokeMember("ReturnSomeValues", //Nombre de la función de interfaz BindingFlags.Default | BindingFlags.InvokeMethod,
nulo,
ComObj, // El componente COM llamado ParamArray, // Matriz de parámetros ParamMods, // Matriz ParameterModifier que especifica el parámetro de retorno nulo,
null);
//Muestra el valor del parámetro.
Console.WriteLine ("Param1 = {0}", ParamArray[0]);
Console.WriteLine ("Param2 = {0}", ParamArray[1]);
Console.WriteLine ("Param3 = {0}", ParamArray[2]);
Console.WriteLine ("Valor de retorno = {0}", ReturnValue );
Tenga en cuenta que para pasar la matriz ParameterModifier correcta a InvokeMethod(), debe inicializar el tipo de datos del parámetro en la matriz de parámetros que acepta la devolución. En el ejemplo anterior, el segundo parámetro es un número entero [5] y el tercer parámetro es un texto [''].