Beim Aufruf der COM-Komponentenschnittstelle verwenden wir im Allgemeinen die Methode Type.InvokeMember(). Type.InvokeMember() muss ein Array vom Typ Object akzeptieren, um beim Aufruf die Parameterinformationen der Schnittstelle zu übergeben. Für Schnittstellenparameter, die nur [in] oder ByVal enthalten, müssen Sie nur ein solches Array erstellen und es an Type.InvokeMember() übergeben.
Wenn die Schnittstellenparameter der COM-Komponente [out]- oder [in, out]-Rückgabeparameter enthalten (ByRef in in VB entwickelten COM-Komponenten), müssen zusätzlich zur oben genannten Methode einige zusätzliche Arbeiten durchgeführt werden. Sie müssen Type.InvokeMember() mitteilen, welche Parameter in den Schnittstellenparametern [in][in,out] oder ByRef-Parameter sind, andernfalls erhalten Sie keinen Rückgabeparameterwert. Um den Wert des Rückgabeparameters [in][in,out] oder ByRef zu erhalten, müssen Sie die überladene Methode Type.InvokeMember() verwenden, die das ParameterModifier-Array enthält.
Das ParameterModifier-Array muss nur ein Element enthalten. Das ParameterModifier-Objekt verfügt über eine Indexeigenschaft namens Item für den aufrufenden Parameter. Wenn in der aufrufenden Schnittstelle der N-te Parameter ein Referenzparameter ist, muss der N-ten Item-Eigenschaft der Wert „true“ zugewiesen werden, um Type.InvokeMember() mitzuteilen, dass es sich um einen Referenzparameter handelt.
Das Folgende ist ein C#-Beispiel für den Aufruf einer COM-Schnittstelle mit drei Parametern (zwei davon sind Referenzparameter. In diesem Beispiel sind der zweite Parameter und der dritte Parameter beide Referenzparameter:
type ComObjType;
Objekt ComObj;
string ReturnValue;
//Erstelle einen Verweis auf das COM-Objekt
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//Konstruieren Sie ein Parameterarray für den Aufruf von InvokeMethod und initialisieren Sie jedes Parameterelement
object[] ParamArray = neues Objekt[3];
ParamArray [0] = "InParam" ;
ParamArray[1] = 5;
ParamArray[2] = "" ;
//Konstruieren Sie das ParameterModifier-Array (beachten Sie, dass das oben erwähnte ParameterModifier-Array nur ein Element enthält)
//Hier gibt es drei Parameter. Daher müssen Sie beim Erstellen eines ParameterModifier-Objekts die Anzahl der Parameter in seinem Konstruktor angeben.
//Verwenden Sie das Indexattribut des Parameters, um anzugeben, welcher Parameter ein zurückgegebener Parameter ist
//Es ist nicht erforderlich, Parameter anzugeben, die [in] oder ByRef sind.
ParameterModifier[] ParamMods = neuer ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3); // Initialisiert auf die Anzahl der Schnittstellenparameter
ParamMods[0][1] = true; // Den zweiten Parameter als Rückgabeparameter festlegen
ParamMods[0][2] = true; //Den dritten Parameter als Rückgabeparameter festlegen
//Rufen Sie die überladene Funktion mit dem ParameterModifier-Array auf
ReturnValue = (string) ComObjType.InvokeMember("ReturnSomeValues", //Name der Schnittstellenfunktion BindingFlags.Default | BindingFlags.InvokeMethod,
null,
ComObj, // Die aufgerufene COM-Komponente ParamArray, // Parameter-Array ParamMods, // ParameterModifier-Array, das den Rückgabeparameter null angibt,
null);
//Zeigt den Wert des Parameters an
Console.WriteLine ("Param1 = {0}", ParamArray[0]) ;
Console.WriteLine ("Param2 = {0}", ParamArray[1]) ;
Console.WriteLine ("Param3 = {0}", ParamArray[2]) ;
Console.WriteLine ("Return Value = {0}", ReturnValue ) ;
Beachten Sie, dass Sie den Datentyp des Parameters im Parameterarray initialisieren müssen, der die Rückgabe akzeptiert, um das richtige ParameterModifier-Array an InvokeMethod() zu übergeben. Im obigen Beispiel ist der zweite Parameter eine Ganzzahl [5] und der dritte Parameter ein Text [''].