Возвращает массив из JS в C # с помощью COM-взаимодействия
-
23-08-2019 - |
Вопрос
Я возвращаю некоторые данные из моего кода 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();