从 WebView 中加载的 WinJS 调用本机 C#

Call Native C# from WinJS that's loaded in a WebView

我知道可以通过创建 Windows 运行时组件然后将其添加为对 WinJS 应用程序的引用来从 WinJS 调用本机 C# --但是当 WinJS 应用程序加载到 WebView 中时,是否可以从 WinJS 应用程序执行相同的操作?

我试过了,但似乎 WebView 中的 WinJS 应用程序在完全不同的环境或其他环境中运行,并且找不到符号,因此它崩溃并提供启动 VS2013 的新实例以尝试调试。

你是对的,原生 JavaScript 应用程序的应用程序主机上下文和 webview 的上下文是两个不同的东西。只有应用程序主机允许 JavaScript 与 WinRT 对话,这也适用于 WinRT 组件,因为组件的结构方式与 WinRT API 本身相同。实际上,你的问题等同于询问是否可以将 WinRT 组件加载到网络浏览器中(因为 webview 本质上是一个网络浏览器控件),那么答案是否定的。

webview 中的代码脱离上下文并与任何可以访问 WinRT API 的代码(JS、C# 等)对话的唯一方法是在 webview 中使用 window.external.notify .该应用程序将该消息作为来自 webview 的事件获取(在带有 x-ms-webview 的 JS 中,它是 MSWebViewScriptNotify, in C#/VB with the XAML WebView it's ScriptNotify)。然后应用程序可以处理调用 API 的参数作为响应。

当然,因为 window.external.notify 不像函数调用那样可以 return 一个值,应用程序必须通过其 InvokeScriptAsync 方法将结果发送到 webview,使其成为异步关系。

我在我的免费电子书的第 4 章(从第 204 页开始)Programming Windows Store Apps with HTML、CSS 中讨论了更多细节, 和 JavaScript, 第二版, http://aka.ms/BrockschmidtBook2.