Uno-Platform:跨平台库,#if 条件适用于 WASM?

Uno-Platform: Cross Platform Library, #if conditional for WASM?

在 4.0 之前的 Uno-Platform 中,我能够在跨平台 class 库中对 WebAssembly 特定代码使用 #if __WASM__ 编译器指令。这对于使用 WASM 特定 SetHtmlAttribute 方法创建 WASM 特定小部件非常有用。

但是,在 4.0 版 Uno-Platform 中,我的代码没有构建,因为编译器没有找到 __WASM__ 常量。我犹豫是否将其手动添加到库 *.csproj 文件中...

<DefineConstants Condition="$(TargetFramework.StartsWith('netstandard'))">__WASM__;$(DefineConstants);</DefineConstants>

... 因为如果目标是 WPF,恐怕它会构建。那么,有没有更好的方法呢?

呸!我不知道为什么我以前没有注意到这一点!看起来 SetHtmlAttribute 已在所有 Uno 目标平台上实现!因此,我可以使用 #if !WINDOWS_UWP 并实现我的 WASM 代码,而不是使用 #if __WASM__ 编译器指令,因为我知道它会在其他 Uno 目标平台上被忽略。

非常聪明,Uno Team!

虽然您的方法涵盖了给定 API 在所有 Uno 目标上可用的场景,但不幸的是,如果它真的是 WASM 或 Skia 特定的,它就不会起作用。对于这些情况,尽管我们有另一种类型的库 - cross-runtime library(参见 docs)。目前这种库只能通过 dotnet command-line 工具创建:

dotnet new unolib-crossruntime -o MyCrossRuntimeLibrary

默认情况下,它会生成以下解决方案布局:

两个项目都指向相同的 source-code 文件,但是“.Wasm”文件专门引用 WebAssembly 运行时并将正确遵守 #if __WASM__ 声明。同样,您可以为“.Skia”创建另一个项目以具有 Skia-specific 声明。