Возвращает массив из JS в C # с помощью COM-взаимодействия

StackOverflow https://stackoverflow.com/questions/713146

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Например;

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] 

Редактировать:Третий способ сделать это в c # 4.0 - использовать новый динамический тип.Динамический тип действительно упрощает выполнение вызовов с поздней привязкой к COM-объектам.

string csv = ((dynamic)result).toString();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top