2009-04-03 6 views
5

Ich gebe einige Daten von meinem JavaScript-Code über COM Interop und das WebBrowser WPF-Steuerelement an meinen C# -Code zurück. Ich habe wieder erfolgreich die Daten, die in Javascript wie folgt aussieht:Zurückgeben eines Arrays von JS nach C# mit COM-Interop

var result = new Array(); 
result[0] = cbCamera.selectedItem; 
result[1] = cbMicrophone.selectedItem; 

Jetzt habe ich das Objekt Ergebnis in C# haben, die wie folgt aussieht:

result.GetType(); 
{Name = "__ComObject" FullName = "System.__ComObject"} 

Wie kann ich die JavaScript-Strings in diesem Dokument enthaltenen erhalten Array, das in diesem ComObject ist?

Antwort

3

Um den Underlaying-Typ des Objekts zu finden, das im rutime-Callable-Wrapper (System .__ ComObject) enthalten ist, würde man eine Refection verwenden. Sie könnten dann aus diesen Informationen einen verwalteten Typ erstellen oder in einen verwalteten Typ umwandeln.

Zum Beispiel;

string type = (string)result.GetType().InvokeMember("getType", 
BindingFlags.InvokeMethod, null, result, null); 

Alternativ können Sie auch invokeMember verwenden, um die Werte abzurufen. Zum Beispiel könnten Sie die valueOf-Methode aufrufen, um das Array in möglichst sinnvolle Grundwerte umzuwandeln, oder toString, um das Array in eine csv-Zeichenkette zu konvertieren.

string result = (string)result.GetType().InvokeMember("toString", 
BindingFlags.InvokeMethod, null, result, null); 
string[] jsArray = result.Split(','); 
// c# jsArray[n] = js result[n] 

EDIT: Ein dritte Weg, dies in 4.0 C# zu tun, ist die neue dynamische Art zu verwenden. Der dynamische Typ macht es wirklich einfach, spät-gebundene Aufrufe von COM-Objekten auszuführen.

string csv = ((dynamic)result).toString(); 
Verwandte Themen