Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UWP开发指南 #47

Open
suhao opened this issue Nov 17, 2022 · 0 comments
Open

UWP开发指南 #47

suhao opened this issue Nov 17, 2022 · 0 comments

Comments

@suhao
Copy link
Member

suhao commented Nov 17, 2022

UWP开发指南

现有工程是基于C++开发的,这里主要讨论C++库,以及基于C++的UWP移植和方案处理。

UWP是微软近些年大力打造的一个支持多设备、多CPU架构、多语言等可以运行在Win10系统的一个通用平台。在这个平台上微软加强了安全性、软件规范性,同时软件必须要经过微软商店的评审,很大程度上保证了软件的质量。

在此平台上,微软摈弃了历史悠久的Win32运行时库,转而提供一个全新的Windows运行时库,被称之为WinRT。WinRT的强大之处在于,它并不限制某一种语言,就目前来说它支持的语言有以下几种

  • C#
  • C++/CX(除C++支持外,微软还进行了扩展,以方便基于WinRT的开发)
  • JavaScript
  • C++/WinRT(微软19年新推出一种是用C++开发的方案)

同时,我们还可以使用多种语言来创建我们自己的WinRT库,来满足软件模块复用的需求。对于C++来说,共有三种模块可选择

  • UWP模块(通用DLL,使用CX语言来调用WinRT运行时,该项目的产出可以用在UWP程序中,但只限于C++直接使用,通常讲不支持多语言(C#也可通过加载C风格函数来调用))
  • C++/CX WinRT运行时模块(可被多语言使用,但是导出类必须使用CX的语法)
  • C++/WinRT运行时模块(可被多语言使用,但是需要IDL文件)

C++/WinRT,该方案支持完全以C++17的语法来编写代码以及调用WinRT的API,但是如果想要创建一个新的WinRT运行时组件,那么就需要把Lyra的导出类和接口都定义为一个IDL文件,然后由必要的WinRT工具生产相应的实现类来进行导出功能。工程量依然巨大和复杂。C++/CX WinRT,该方案则需要使用CX的语法来将功能导出,同样工程量不小。

UWP模块,该方案可以直接使用现有的C++代码,导出方式也和传统的Win32DLL一致,需要注意的是,某些Win32函数将不再支持,因此,移植的工作就是查看哪些函数不能在UWP环境下运行,然后在WinRT中找到替代方案来代替它。

开发实践

1. 安装包的自定义配置

DISM全称是Deployment Image Servicing and Management,一个命令行的部署映像服务和管理工具。针对特殊的渠道版本,需要附带自定义配置信息,可以利用Preinstall Apps Using DISM中的Use custom data files来实现。

DISM会在App的安装目录下生成的Custom.data文件,文件的格式可以自定义,文件名和内容生成无法修改,后续用户通过商店升级APP后,这个文件也不会丢失。直到用户卸载App时被一起移除,开发者可以将文件放到Appx/microsoft.system.package.metadata目录下(microsoft.system.package.metadata为隐藏目录),来调试自定义配置的定制版本功能。

2. 与网页的交互

参考:https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/web-view

可以通过使用InvokeScriptAsync来调用或注入脚本到webview,通过ScriptNotify 事件从 webview获取信息。

  • InvokeScriptAsync 只能传递 & 返回string值
  • 可以使用eval 方法来注入内容到网页: string functionString = String.Format("document.getElementById('nameDiv').innerText = 'Hello, {0}';", nameTextBox.Text); await webView1.InvokeScriptAsync("eval", new string[] { functionString });
  • 网页内容通过使用 window.external.notify 和 一个 string 参数来发送信息到app,注册 ScriptNotify 就能收到这些信息。为了在调用 window.external.notify 时能发出 ScriptNotify 事件,app必须在 manifest 里包含页面的 URI 到 ApplicationContentUriRules 里,这些 URI 必须使用 https ,可以使用通配符指定子域名,比如:https://*.microsoft.com。对于 app 包内的内容(比如将网页文件放在包内),并无此要求,可以直接使用 ms-local-stream:// URI 即可。

3. UWP开发的Visual studio插件推荐

UWP开发涉及很多UI布局文件,为便于协作和防止xaml文件的冲突,建议安装xaml styler插件,统一xaml格式,减少文件修改的冲突发生。安装后修改XAML Styler配置,Keep first attribute on same line设置为true,Format XAML on save改为false

4. 资源管理

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant