如何在 UWP C# 应用程序中访问 UWP JS API?

Posted

技术标签:

【中文标题】如何在 UWP C# 应用程序中访问 UWP JS API?【英文标题】:How to access UWP JS APIs in a UWP C# app? 【发布时间】:2019-10-02 12:48:54 【问题描述】:

我们有一堆使用UWP APIs 的 javascript 代码,这些代码是为 UWP Javascript 应用程序 (.jsproj) 编写的。现在这个应用程序被重写为一个 UWP C# 应用程序。

C#、JS 和 C++ 中的 UWP API 非常相似,see these examples for ApplicationData.LocationSetting,因此迁移代码不会有太大的努力 - 但仍然是必须完成的工作。

有没有办法让我不必必须用 C# 重写我们所有的 JavaScript 代码才能在我们重写的应用程序中使用它?我可以在 UWP C# 应用程序中以某种方式使用 UWP JS API 吗?

我希望我可以使用简单的webview 以某种方式访问​​ API(我的想法是 UWP JS 应用程序基本上只是一个 web 视图),但在我的测试中我无法访问他们在那里。

【问题讨论】:

不清楚你的问题是什么。首先,您说您正在将 JS 应用程序重写为 C#。然后你说你不想将你的 JS 代码重写为 C#。可以从 JS 和 C# 调用 UWP API。你能举一个在 JS 中而不是在 C# 中工作的 UWP API 的例子吗?您可以在the UWP samples repo 中找到许多 JS 和 C# 之间的翻译示例。它们调用相同的底层 UWP API。 我正在询问一种在 UWP C# 应用程序中使用针对 UWP JS API 编写的 JS 代码的方法(类似于如何通过 Windows 在 UWP JS 应用程序中使用 UWP C# API例如,另一个方向的运行时组件),而不是用 C# 重写该 JS 代码。 啊,我明白了。在前两段中,您的意思是“操作系统中的 UWP API”,但在第三段中,您的意思是“我的应用程序中的 UWP API”。这有点用词不当,因为您的 JS 应用程序中的那些函数不是 UWP API;它们只是 JS 函数。您真正要问的是“我有一些用 JS 编写的函数,我想从 C# 中调用它们。”您可以创建一个 WebView,将您的 JS 放入该 WebView,然后使用 AddWebAllowedObject 将您的 C# 对象注入 WebView,然后使用 InvokeScriptAsync 调用函数并收集结果。 AddWebAllowedObject for Windows.* 听起来像是一个主意,我会研究一下。谢谢。 (是的,选择合适的词来描述这一点并不容易——UWP JS 似乎已经几乎从文档中消失了:/) 【参考方案1】:

虽然我完全同意 JavaScript 代码看起来类似于 C# 代码。恐怕您无法像第一篇文章中提到的那样得到想要的东西。 webview 控件是轻量级的,我认为该控件不可能包含运行 js 代码所需的所有组件。

如果您之前在 Windows 运行时组件中编写过一些代码,例如提到的这个文档Walkthrough: Creating a Simple Windows Runtime component and calling it from JavaScript,那么您可以重用 Windows 运行时组件。但是如果你还没有这样做,那么恐怕你必须用 C# 重写你的代码。

好吧,顺便说一句,我相信你会发现 C# 代码对你来说很容易编写,因为 UWP C# 演示比 UWP JS 演示更多。

【讨论】:

遗憾,我希望有一个我错过的桥接器或 API 可以使 UWP JS 在 UWP C# 中可用。我们确实有一些 WinRT 组件,但大部分都是“在平台上”构建的,纯 JavaScript 也是如此。 (我们迁移的一个原因是 UWP JS 已被弃用/放弃,所以我非常清楚 UWP C# 有更好的文档记录 :)) @janpio 是的,没有桥。目前 PWA 是推荐技术。 docs.microsoft.com/en-us/uwp/api/… 列出的两个选项呢?如果您需要使用本机代码,PWA 还没有准备好。 @janpio Raymond 走在了正确的轨道上。 AddWebAllowedObject 和 InvokeScriptAsync 是适合您的方法。但由于我不知道你的项目中写了什么,我不知道哪种方式更适合你,要么用 C# 重写整个项目,要么直接使用 AddWebAllowedObject 和 webview。无论如何,您可以先尝试一下 AddWebAllowedObject,看看它是否已经满足您的要求。【参考方案2】:

这从来没有得到正确的答案,但正确的答案是使用现已弃用的 JSRT api。这些可以在here 找到,关于它们的旧博客文章可以提供一些了解可以在here 找到。

显然,随着 Spartan Edge 的弃用,这不再那么有用了,但在没有其他选择的情况下仍然可以提供帮助。

【讨论】:

感谢您的回复 - 我可能 真的 需要知道 2 年前 :D 是的,抱歉,我认为它可能会帮助其他拼命尝试挽救应用的人。 不用道歉,我喜欢你现在发布这个。

以上是关于如何在 UWP C# 应用程序中访问 UWP JS API?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows UWP 应用程序中使用 Python 和 C#

Zipfile OpenRead 在 c# uwp 应用程序中抛出对路径的访问被拒绝异常?

如何将 C# UWP 应用程序的非 UI 部分转换为 JavaScript?

如何在 c# UWP 应用程序中播放 rtmp

如何在 Visual Studio 2019 中使用 Xamarin Forms(UWP) 和 C# 创建 Web 应用程序

如何在 UWP 应用程序中创建 COM 对象? (C#)