Ao chamar a interface do componente COM, geralmente usamos o método Type.InvokeMember(). Type.InvokeMember() precisa aceitar um array do tipo Object para passar as informações dos parâmetros da interface quando ela for chamada. Para parâmetros de interface que contêm apenas [in] ou ByVal, você só precisa construir tal array e passá-lo para Type.InvokeMember().
Se os parâmetros de interface do componente COM contiverem parâmetros de retorno [out] ou [in, out] (ByRef em componentes COM desenvolvidos em VB), então, além do método acima, algum trabalho adicional deverá ser feito. Você deve informar Type.InvokeMember() quais parâmetros nos parâmetros da interface são [in][in,out] ou ByRef, caso contrário, você não obterá nenhum valor de parâmetro de retorno. Para obter o valor do parâmetro de retorno [in][in,out] ou ByRef, você deve usar o método sobrecarregado Type.InvokeMember() que contém o array ParameterModifier.
A matriz ParameterModifier precisa conter apenas um elemento. O objeto ParameterModifier possui uma propriedade de índice chamada Item para o parâmetro de chamada. Na interface de chamada, se o enésimo parâmetro for um parâmetro de referência, então a propriedade Nth Item deverá receber um valor true para informar Type.InvokeMember() que este é um parâmetro de referência.
A seguir está um exemplo C# de chamada de uma interface COM com três parâmetros (dois dos quais são parâmetros de referência). Neste exemplo, o segundo parâmetro e o terceiro parâmetro são parâmetros de referência:
type ComObjType;
objeto ComObj;
string ReturnValue;
//Cria uma referência para o objeto COM
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//Constrói uma matriz de parâmetros para a chamada para InvokeMethod e inicializa cada elemento de parâmetro
objeto[] ParamArray = novo objeto[3];
ParamArray[0] = "InParam";
ParamArray[1] = 5;
ParamArray[2] = "" ;
//Constrói o array ParameterModifier (observe que há apenas um elemento no array ParameterModifier mencionado acima)
//Existem três parâmetros aqui. Portanto, ao criar um objeto ParameterModifier, deve-se indicar a quantidade de parâmetros em seu construtor.
//Use o atributo index do parâmetro para indicar qual parâmetro é um parâmetro retornado
//Não há necessidade de especificar parâmetros que sejam [in] ou ByRef.
ParameterModifier[] ParamMods = novo ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3); // Inicializado com o número de parâmetros da interface
ParamMods[0][1] = true; // Define o segundo parâmetro como parâmetro de retorno
ParamMods[0][2] = true; //Definir o terceiro parâmetro como parâmetro de retorno
//Chama a função sobrecarregada que contém o array ParameterModifier
ReturnValue = (string) ComObjType.InvokeMember("ReturnSomeValues", //Nome da função de interface BindingFlags.Default | BindingFlags.InvokeMethod,
nulo,
ComObj, // O componente COM chamado ParamArray, // Matriz de parâmetros ParamMods, // Matriz ParameterModifier especificando o parâmetro de retorno null,
null);
//Exibe o valor do parâmetro
Console.WriteLine ("Param1 = {0}", ParamArray[0]) ;
Console.WriteLine ("Param2 = {0}", ParamArray[1]) ;
Console.WriteLine ("Param3 = {0}", ParamArray[2]) ;
Console.WriteLine ("Return Value = {0}", ReturnValue ) ;
Observe que para passar a matriz ParameterModifier correta para InvokeMethod(), você deve inicializar o tipo de dados do parâmetro na matriz de parâmetros que aceita o retorno. No exemplo acima, o segundo parâmetro é um número inteiro [5] e o terceiro parâmetro é um texto [''].