Вызов Native C# из WinJS, который загружен в WebView

Я знаю, что можно назвать родным C# от WinJS создав компонент времени выполнения Windows, а затем добавив его в качестве ссылки на WinJS приложение - но возможно ли сделать то же самое из WinJS приложение, когда оно загружено внутри WebView?

Я пробовал, но, похоже, WinJS приложение внутри WebView работает в совершенно другом контексте или что-то в этом роде и не находит символы, поэтому он вылетает и предлагает запустить новый экземпляр VS2013 попробовать и отладить.

1 ответ

Решение

Вы правы в том, что контекст хоста приложения для нативного приложения JavaScript и контекст веб-просмотра - это две разные вещи. Только хост приложения позволяет JavaScript взаимодействовать с WinRT, что также относится и к компонентам WinRT, поскольку компоненты структурированы так же, как и сами API WinRT. По сути, ваш вопрос такой же, как вопрос о том, можете ли вы загрузить компонент WinRT в веб-браузер (потому что веб-просмотр - это, по сути, элемент управления веб-браузера), тогда ответ - нет.

Единственный способ для кода внутри веб-просмотра выйти из этого контекста и поговорить с любым кодом (JS, C# и т. Д.), Который может получить доступ к WinRT API, - это использовать window.external.notify из веб-просмотра. Приложение воспринимает это сообщение как событие, исходящее из веб-просмотра (в JS с x-ms-webview это MSWebViewScriptNotify, в C#/VB с XAML WebView это ScriptNotify). Затем приложение может обработать аргументы вызова API в ответ.

Конечно, поскольку window.external.notify не действует как вызов функции, поскольку вы можете возвращать значение, приложению придется отправлять результаты в веб-представление через метод InvokeScriptAsync, что делает его асинхронным.

Я подробнее расскажу о деталях в главе 4 (начиная со страницы 204) моей бесплатной электронной книги " Программирование приложений Магазина Windows с использованием HTML, CSS и JavaScript, 2-е издание", http://aka.ms/BrockschmidtBook2.

Другие вопросы по тегам