2009-04-03 3 views
5

Я возвращаю некоторые данные из моего кода JavaScript в код C# через COM Interop и элемент управления WPF WebBrowser. Я успешно вернулся данные, который выглядит, как это в JavaScript:Возвращение массива из JS в C# с помощью COM-Interop

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

Теперь у меня есть результат объекта в C#, который выглядит следующим образом:

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

Как я могу получить JavaScript строки, содержащиеся в этом массив, который находится в этом ComObject?

ответ

3

Чтобы найти подстилающий объект, содержащийся в обертке, вызываемой rutime (System .__ ComObject), вы должны использовать refection. Затем вы сможете создать или передать управляемый тип из этой информации.

Например,

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

В качестве альтернативы вы можете использовать invokeMember для извлечения значений. Например, вы могли бы вызвать метод valueOf для преобразования массива в наиболее значимые примитивные значения или toString для скрытия массива в строку csv.

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

EDIT: Третий способ сделать это в C# 4.0 - использовать новый динамический тип. Динамический тип позволяет очень легко совершать вызовы поздней связи на COM-объектах.

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

 Смежные вопросы

  • Нет связанных вопросов^_^