我知道可以通过创建 Windows 运行时组件然后将其添加为应用程序的引用来调用本机C#
-WinJS
但是当应用程序加载到内部时是否可以WinJS
从应用程序执行相同的操作?WinJS
WebView
我已经尝试过了,但似乎WinJS
里面的应用程序在WebView
完全不同的上下文或其他东西中运行并且没有找到符号,所以它崩溃并提供启动一个新实例VS2013
来尝试和调试。
我知道可以通过创建 Windows 运行时组件然后将其添加为应用程序的引用来调用本机C#
-WinJS
但是当应用程序加载到内部时是否可以WinJS
从应用程序执行相同的操作?WinJS
WebView
我已经尝试过了,但似乎WinJS
里面的应用程序在WebView
完全不同的上下文或其他东西中运行并且没有找到符号,所以它崩溃并提供启动一个新实例VS2013
来尝试和调试。
你是正确的,原生 JavaScript 应用程序的应用程序宿主上下文和 webview 的上下文是两个不同的东西。只有应用程序主机允许 JavaScript 与 WinRT 对话,这也适用于 WinRT 组件,因为组件的结构与 WinRT API 本身的结构相同。实际上,您的问题与询问是否可以将 WinRT 组件加载到 Web 浏览器中(因为 webview 本质上是 Web 浏览器控件)相同,那么答案是否定的。
让 webview 中的代码脱离该上下文并与可以访问 WinRT API 的任何代码(JS、C# 等)对话的唯一方法是在 webview 中使用 window.external.notify。该应用程序将该消息作为来自 webview 的事件接收(在带有 x-ms-webview 的 JS 中是MSWebViewScriptNotify,在带有 XAML WebView 的 C#/VB 中是ScriptNotify)。然后,应用程序可以处理参数调用 API 作为响应。
当然,因为 window.external.notify 不像函数调用那样可以返回值,所以应用程序必须通过其 InvokeScriptAsync 方法将结果发送到 webview,使其成为异步关系。
我在免费电子书的第 4 章(从第 204 页开始)详细讨论了使用 HTML、CSS 和 JavaScript 编程 Windows 商店应用程序,第 2 版,http://aka.ms/BrockschmidtBook2。