.NET 在鸿蒙系统上的适配现状
目录
.NET 在鸿蒙系统上的适配现状
鸿蒙系统对虚拟机的限制与.NET的适配挑战
NativeAOT 在鸿蒙系统中的适配原理与实现方式
已知问题与解决方案:鸿蒙系统中的 syscall 限制
鸿蒙系统适配中的技术难点与解决方案
跨平台编译的挑战与应对策略
依赖库管理与兼容性问题
随着全球科技格局的不断演变,操作系统作为智能设备的核心基础软件,其国产化进程成为各国科技发展的重要方向。在这一背景下,华为推出的鸿蒙操作系统(HarmonyOS)凭借其分布式架构、高兼容性和出色的跨设备协同能力,迅速成为国产操作系统领域的代表。鸿蒙系统不仅在国内智能手机市场取得了显著进展,还逐步拓展至智能家居、工业物联网、车载系统等多个领域,构建起一个完整的生态系统。
在国产化浪潮的推动下,越来越多的软件平台和开发框架开始适配鸿蒙系统,以确保其在国产操作环境中的兼容性与性能表现。对于开发者而言,适配鸿蒙系统不仅是技术上的挑战,更是市场机会的体现。鸿蒙系统的崛起为中国软件产业提供了新的发展契机,使本土开发者能够基于自主可控的操作系统构建更加丰富的应用生态。此外,鸿蒙系统的分布式特性也为跨设备应用的开发提供了全新的可能性,使得软件能够在不同终端之间无缝迁移,从而提升用户体验。
在这一趋势下,.NET 作为一款广受开发者青睐的编程语言和开发框架,也面临着适配鸿蒙系统的重要课题。.NET 以其强大的跨平台能力、高效的性能优化以及丰富的生态系统,在客户端开发领域占据重要地位。然而,鸿蒙系统在内存管理、虚拟机限制等方面的特殊要求,使得传统的 .NET 运行时(如 CoreCLR 和 Mono)难以直接集成。因此,开发者需要探索新的运行时方案,以确保 .NET 应用能够在鸿蒙环境中稳定运行。这一挑战不仅涉及底层技术的适配,还需要对鸿蒙系统的架构特性有深入的理解,以便制定合理的解决方案。
鸿蒙系统的适配不仅是技术上的突破,更是中国软件产业发展的关键一步。通过将 .NET 成功移植到鸿蒙平台,开发者可以进一步丰富鸿蒙生态的应用类型,提升其在智能终端市场的竞争力。同时,这也为其他技术栈的适配提供了参考,推动整个国产软件生态的成熟与完善。随着鸿蒙系统的不断演进,.NET 在其中的适配进展将成为开发者关注的重要议题,并对未来的技术发展方向产生深远影响。
.NET 在鸿蒙系统上的适配现状
目前,.NET 已经成功在鸿蒙系统(HarmonyOS Next)上运行,标志着这一适配工作取得了初步成果。然而,尽管 .NET 能够在鸿蒙平台上运行,其完整性和稳定性仍在不断完善之中。例如,Avalonia 移植项目已经在部分大内存真机上初步运行,显示出 .NET 在鸿蒙系统上的可行性,但整体的适配工作仍然处于探索和优化阶段。这一进展表明,虽然鸿蒙系统的特殊限制给 .NET 的适配带来了挑战,但通过技术手段和社区协作,开发者仍然能够克服这些障碍,并逐步完善 .NET 在鸿蒙平台上的运行环境。
鸿蒙系统对虚拟机的限制是 .NET 适配过程中面临的主要挑战之一。自 HarmonyOS 5.0.0(12)版本起,系统禁止匿名内存申请可执行权限,除了系统内置的 JavaScript 引擎外,其他虚拟机无法使用 JIT(Just-In-Time)编译技术。这一限制使得传统的 .NET 运行时,如 CoreCLR 和 Mono,难以直接集成到鸿蒙系统中。CoreCLR 作为 .NET 的核心运行时,依赖于 JIT 编译机制来实现动态代码优化,而 Mono 虽然支持解释执行,但其性能相对较低,因此也不适合用于鸿蒙系统。由于这些原因,开发者最终选择了 NativeAOT(Ahead-Of-Time)作为适配方案,以确保 .NET 应用能够在鸿蒙平台上稳定运行。
NativeAOT 是 .NET 提供的一种编译模式,它允许将 C# 代码在编译阶段直接转换为原生机器码,而无需依赖 JIT 或解释执行。这种编译方式能够有效规避鸿蒙系统对 JIT 的限制,同时提供更高的运行效率。鸿蒙系统兼容 musl 的 Linux 动态库(.so),而 .NET 的运行时标识符(RID)支持 linux-musl-arm64 和 linux-musl-x64,这意味着 .NET 应用可以被编译为 Linux 原生动态库,然后在鸿蒙的原生项目中通过 dlopen 和 dlsym 等函数调用 C# 入口函数。此外,C# 调用鸿蒙 API 的方式主要依赖于 P/Invoke(平台调用),通过鸿蒙的 NDK 实现对系统接口的访问。而对于 ArkUI 的 TypeScript API,则通过 NDK 中的 NAPI 调用,从而实现 .NET 与鸿蒙 UI 框架的交互。
尽管 NativeAOT 提供了一种可行的适配方案,但其在鸿蒙系统上的应用仍面临一些挑战。例如,由于鸿蒙系统对系统调用(syscall)进行了严格的限制,某些底层操作可能会受到 seccomp(安全计算模式)的约束。在鸿蒙的 seccomp 白名单中,并未包含 .NET 运行时初始化所需的部分系统调用,这可能导致 .NET 应用在启动时直接崩溃。此外,跨平台编译、依赖库管理以及性能优化等问题也需要进一步探索和解决。尽管如此,当前的适配进展已经证明,.NET 在鸿蒙系统上的运行是可行的,并且随着社区的持续努力,这一适配工作有望在未来变得更加成熟和稳定。
鸿蒙系统对虚拟机的限制与.NET的适配挑战
鸿蒙系统对虚拟机的限制是 .NET 适配过程中面临的关键挑战之一。自 HarmonyOS 5.0.0(12)版本起,系统禁止匿名内存申请可执行权限,除了系统内置的 JavaScript 引擎外,其他虚拟机无法使用 JIT(Just-In-Time)编译技术。这一限制直接影响了 .NET 运行时的适配方案,使得传统的运行时(如 CoreCLR 和 Mono)无法直接集成到鸿蒙系统中。
CoreCLR 是 .NET 的核心运行时,它依赖于 JIT 编译机制来实现动态代码优化。然而,鸿蒙系统对 JIT 的限制使得 CoreCLR 无法在鸿蒙平台上正常运行。CoreCLR 在运行时需要动态生成可执行代码,并将其加载到内存中,而鸿蒙系统禁止匿名内存申请可执行权限,这使得 CoreCLR 无法完成必要的代码生成和加载操作,从而导致运行失败。此外,CoreCLR 依赖于 .NET 的垃圾回收机制(GC),该机制需要动态分配和管理内存,而鸿蒙系统对内存的管理策略与传统的 Linux 发行版有所不同,进一步增加了 CoreCLR 适配的难度。
Mono 作为另一个流行的 .NET 运行时,虽然支持解释执行模式,但其性能表现并不理想。Mono 的解释执行方式会导致较高的运行时开销,这在鸿蒙系统上尤为明显。由于鸿蒙系统对内存和 CPU 资源的管理较为严格,Mono 的低效执行模式可能会导致应用运行缓慢,甚至影响整个系统的稳定性。此外,鸿蒙系统的 seccomp 限制使得某些底层系统调用无法被 Mono 正常调用,进一步降低了其适配的可行性。因此,尽管 Mono 提供了一种替代方案,但其性能问题和兼容性限制使得它并不适合作为鸿蒙系统的 .NET 运行时。
由于 CoreCLR 和 Mono 都无法在鸿蒙系统上直接运行,开发者最终选择了 NativeAOT(Ahead-Of-Time)作为适配方案。NativeAOT 是 .NET 提供的一种编译模式,它允许在编译阶段将 C# 代码直接转换为原生机器码,而无需依赖 JIT 或解释执行。这种方式能够有效规避鸿蒙系统对 JIT 的限制,同时提供更高的运行效率。鸿蒙系统兼容 musl 的 Linux 动态库(.so),而 .NET 的 RID(运行时标识符)支持 linux-musl-arm64 和 linux-musl-x64,这意味着 .NET 应用可以被编译为 Linux 原生动态库,然后在鸿蒙的原生项目中通过 dlopen 和 dlsym 等函数调用 C# 入口函数。
此外,C# 调用鸿蒙 API 的方式主要依赖于 P/Invoke(平台调用),通过鸿蒙的 NDK 实现对系统接口的访问。而对于 ArkUI 的 TypeScript API,则通过 NDK 中的 NAPI 调用,从而实现 .NET 与鸿蒙 UI 框架的交互。这种方法不仅能够绕过鸿蒙系统对 JIT 的限制,还能充分利用鸿蒙系统的原生功能,确保 .NET 应用在鸿蒙平台上的稳定运行。
尽管 NativeAOT 提供了一种可行的适配方案,但其在鸿蒙系统上的应用仍面临一些挑战。例如,由于鸿蒙系统对系统调用(syscall)进行了严格的限制,某些底层操作可能会受到 seccomp(安全计算模式)的约束。在鸿蒙的 seccomp 白名单中,并未包含 .NET 运行时初始化所需的部分系统调用,这可能导致 .NET 应用在启动时直接崩溃。此外,跨平台编译、依赖库管理以及性能优化等问题也需要进一步探索和解决。尽管如此,当前的适配进展已经证明,.NET 在鸿蒙系统上的运行是可行的,并且随着社区的持续努力,这一适配工作有望在未来变得更加成熟和稳定。
NativeAOT 在鸿蒙系统中的适配原理与实现方式
为了克服鸿蒙系统对 JIT 编译的限制,开发者选择了 NativeAOT(Ahead-Of-Time)作为 .NET 在鸿蒙平台上的适配方案。NativeAOT 是 .NET 提供的一种编译模式,它允许在编译阶段将 C# 代码直接转换为原生机器码,从而避免依赖 JIT 或解释执行。这种方式能够有效规避鸿蒙系统对 JIT 的限制,同时提供更高的运行效率。鸿蒙系统兼容 musl 的 Linux 动态库(.so),而 .NET 的运行时标识符(RID)支持 linux-musl-arm64 和 linux-musl-x64,这意味着 .NET 应用可以被编译为 Linux 原生动态库,然后在鸿蒙的原生项目中通过 dlopen 和 dlsym 等函数调用 C# 入口函数。
具体而言,开发者可以使用 .NET SDK 将 C# 代码编译为 native AOT 模式,生成适用于 Linux 的动态库(.so 文件)。随后,在鸿蒙的原生项目中,开发者可以通过 C/C++ 代码加载该动态库,并调用其中的 C# 函数。这一过程涉及以下几个关键步骤:首先,通过 dlopen 函数加载 .so 文件,然后使用 dlsym 获取特定函数的地址,最后通过函数指针调用 C# 方法。这种方式使得 .NET 代码能够在鸿蒙系统中运行,而无需依赖 JIT 编译机制。此外,由于鸿蒙系统基于 Linux 内核,因此 NativeAOT 生成的代码可以直接在鸿蒙平台上运行,从而确保兼容性。
在鸿蒙系统中,C# 调用鸿蒙 API 的方式主要依赖于 P/Invoke(平台调用),通过鸿蒙的 NDK(Native Development Kit)实现对系统接口的访问。P/Invoke 是一种允许 C# 代码调用本地 C/C++ 函数的机制,它使得 .NET 应用能够直接调用鸿蒙的原生 API,从而实现与系统功能的交互。例如,开发者可以使用 P/Invoke 调用鸿蒙的文件系统、网络通信或设备管理接口,以满足应用程序的需求。此外,对于 ArkUI 的 TypeScript API,开发者可以通过 NDK 中的 NAPI(Native Addon Interface)进行调用,从而实现 .NET 与鸿蒙 UI 框架的交互。NAPI 提供了一种标准化的接口,使得 C/C++ 代码能够与 TypeScript 代码进行通信,从而确保 .NET 应用能够充分利用鸿蒙系统的 UI 组件和功能。
尽管 NativeAOT 提供了一种可行的适配方案,但其在鸿蒙系统上的应用仍面临一些挑战。例如,由于鸿蒙系统对系统调用(syscall)进行了严格的限制,某些底层操作可能会受到 seccomp(安全计算模式)的约束。在鸿蒙的 seccomp 白名单中,并未包含 .NET 运行时初始化所需的部分系统调用,这可能导致 .NET 应用在启动时直接崩溃。此外,跨平台编译、依赖库管理以及性能优化等问题也需要进一步探索和解决。尽管如此,当前的适配进展已经证明,.NET 在鸿蒙系统上的运行是可行的,并且随着社区的持续努力,这一适配工作有望在未来变得更加成熟和稳定。
已知问题与解决方案:鸿蒙系统中的 syscall 限制
在鸿蒙系统中,开发者面临的另一个重要挑战是 seccomp(安全计算模式)对系统调用(syscall)的严格限制。seccomp 是一种 Linux 内核的安全机制,用于限制进程可以调用的系统调用,以提高系统的安全性。鸿蒙系统对 seccomp 的配置较为激进,仅允许白名单中的系统调用,任何未被授权的系统调用都会导致进程直接终止。这一限制对 .NET 在鸿蒙系统上的适配带来了显著影响,尤其是在运行时初始化阶段。
具体而言,.NET 的运行时初始化过程中会调用 __NR_get_mempolicy
系统调用,用于检查 NUMA(非统一内存访问)支持。然而,__NR_get_mempolicy
并未包含在鸿蒙的 seccomp 白名单中,导致 .NET 应用在启动时直接崩溃。这一问题在 Android 平台上并未出现,因为 .NET 为 Android 提供了专门的适配代码,绕过了相关系统调用。然而,在鸿蒙平台上,由于使用的是标准的 Linux 代码路径,没有对 __NR_get_mempolicy
进行特殊处理,因此导致了运行时错误。
为了解决这一问题,开发者需要对 .NET 的运行时代码进行修改,以规避 __NR_get_mempolicy
调用,或者在鸿蒙系统中调整 seccomp 白名单,允许该系统调用。目前,社区已经提出了一些解决方案。例如,可以通过修改 .NET 的运行时源代码,在鸿蒙平台上跳过 NUMA 检查,从而避免调用 __NR_get_mempolicy
。此外,开发者也可以尝试在鸿蒙系统中自定义 seccomp 策略,将 __NR_get_mempolicy
添加到白名单中,以允许该系统调用。然而,这一方法需要对鸿蒙系统的安全策略进行深入理解,并可能涉及系统级别的修改,因此需要谨慎操作。
除了 __NR_get_mempolicy
问题,鸿蒙系统中的 seccomp 白名单还可能限制其他与 .NET 运行相关的系统调用。例如,某些内存管理或线程调度相关的调用可能不在白名单中,导致 .NET 应用在运行过程中出现异常。因此,开发者在适配过程中需要密切关注鸿蒙系统的 seccomp 配置,并根据实际需求调整白名单,以确保 .NET 应用的稳定运行。
目前,鸿蒙系统的 seccomp 白名单配置可以在以下路径中找到:https://gitee.com/openharmony/startup_init/blob/master/services/modules/seccomp/seccomp_policy/app.seccomp.policy
。该文件详细列出了允许的系统调用,开发者可以参考该文件,判断哪些调用可能影响 .NET 的运行,并进行相应的调整。此外,随着鸿蒙系统的不断发展,未来可能会进一步优化 seccomp 策略,以提高对第三方运行时的支持,从而减少类似问题的发生。
综上所述,鸿蒙系统中的 seccomp 限制是 .NET 适配过程中需要重点解决的问题之一。通过调整运行时代码或优化系统配置,开发者可以规避 __NR_get_mempolicy
等关键系统调用的问题,从而确保 .NET 应用在鸿蒙平台上的稳定运行。随着鸿蒙生态的不断成熟,相关适配方案也将逐步完善,为 .NET 在鸿蒙系统上的广泛应用奠定基础。
鸿蒙系统适配中的技术难点与解决方案
在 .NET 适配鸿蒙系统的过程中,开发者面临诸多技术难点,包括跨平台编译、依赖库管理、性能优化以及鸿蒙系统架构的特殊限制。这些问题不仅影响 .NET 应用在鸿蒙平台上的运行稳定性,也决定了适配工作的整体难度。因此,针对这些挑战,开发者需要采取一系列解决方案,以确保 .NET 在鸿蒙系统上的顺利运行。
跨平台编译的挑战与应对策略
跨平台编译是 .NET 适配鸿蒙系统的一项核心任务。鸿蒙系统主要基于 ARM64 架构,而大多数开发者通常在 x86 架构的 Windows 或 macOS 平台上进行开发,因此需要将 .NET 代码编译为适用于 arm64 的 Linux 动态库(.so 文件)。然而,传统的 .NET 编译工具链并不直接支持跨平台编译,尤其是在 NativeAOT 模式下,开发者需要额外的配置和工具支持。
为了解决这一问题,社区开发了名为 PublishAotCross
的工具,用于支持跨平台编译。该工具允许开发者在 Windows 或 macOS 上直接编译适用于 arm64 的 .so 文件,并确保其能够在鸿蒙系统上运行。然而,PublishAotCross
在处理某些压缩相关 API 时仍存在兼容性问题,因此开发者需要在编译过程中进行额外的调整,以确保最终生成的动态库能够在鸿蒙平台上正常运行。此外,开发者还可以通过构建本地编译环境,使用 Linux 的 arm64 虚拟机或容器(如 Docker)进行编译,从而获得更稳定的跨平台编译体验。
依赖库管理与兼容性问题
在鸿蒙系统上运行 .NET 应用时,依赖库的管理是一个关键问题。鸿蒙系统使用 musl libc 而非 glibc,这导致某些 Linux 下常见的依赖库(如 ICU 和 OpenSSL)在鸿蒙平台上可能无法直接使用。此外,.NET 运行时默认使用静态链接,但在鸿蒙环境下,开发者需要自行编译这些依赖库,以确保其兼容性。
为了解决这一问题,开发者可以尝试使用鸿蒙 NDK 提供的兼容库,或者寻找支持 musl libc 的第三方依赖库。例如,OpenSSL 在鸿蒙系统上的兼容性问题较为突出,因此开发者需要确保使用经过适配的版本,或者在编译时调整链接方式,以避免兼容性冲突。此外,对于某些关键的第三方库,如 Avalonia 所依赖的 libfontconfig.so.1
,开发者需要确保其能够在鸿蒙系统上正常运行,否则需要寻找替代方案或自行编译兼容版本。
相关文章:
.NET 在鸿蒙系统上的适配现状
目录 .NET 在鸿蒙系统上的适配现状 鸿蒙系统对虚拟机的限制与.NET的适配挑战 NativeAOT 在鸿蒙系统中的适配原理与实现方式 已知问题与解决方案:鸿蒙系统中的 syscall 限制 鸿蒙系统适配中的技术难点与解决方案 跨平台编译的挑战与应对策略 依赖库管理与兼容…...
01-centos离线升级至almalinux
官网链接官方代码调整: 1. vi repositories/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py with mounting.BindMount(sourceuserspace_dir, targetos.path.join(context.base_dir, install_root_dir.lstrip(/))):_restore_persi…...
Python 处理图像并生成 JSONL 元数据文件 - 固定text版本
Python 处理图像并生成 JSONL 元数据文件 - 固定text版本 flyfish JSONL(JSON Lines)简介 JSONL(JSON Lines,也称为 newline-delimited JSON)是一种轻量级的数据序列化格式,由一系列独立的 JSON 对象组成…...
uniapp使用npm下载
uniapp的项目在使用HBuilder X创建时是不会有node_modules文件夹的,如下图所示: 但是uni-app不管基于哪个框架,它内部一定是有node.js的,否则没有办法去实现框架层面的一些东西,只是说它略微有点差异。具体差异表现在…...
前端面试每日三题 - Day 31
这是我为准备前端/全栈开发工程师面试整理的第30天每日三题练习: ✅ 题目1:WebAssembly前端深度实践指南 核心优势对比 维度JavaScriptWebAssembly解析速度需要解析编译预编译二进制执行性能动态类型较慢静态类型接近原生内存管理自动垃圾回收手动内存…...
通义千问席卷日本!开源界“卷王”阿里通义千问成为日本AI发展新基石
据日本经济新闻(NIKKEI)报道,通义千问已成为日本AI开发的新基础,其影响力正逐步扩大,深刻改变着日本AI产业的格局。 同时,日本经济新闻将通义千问Qwen2.5-Max列为全球AI模型综合评测第六名,不仅…...
01 安装CANoe
文章目录 0、Introduction1、Install CANoe1.1、Unlock Package1.2、Kick autorun1.3、Install CANoe1.4、Wait Download1.5、Restart application1.6、Vector CANoe Installation1.7、Installation Successfully1.8、Open CANoe 2、Install Drivers2.1、Unlock Package2.2、Ki…...
AutoDL租用服务器教程
在跑ai模型的时候,容易遇到算力不够的情况。此时便需要租用服务器。autodl是个较为便宜的服务器租用平台,h20仅需七点几元每小时。下面是简单的介绍。 打开网站AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL,并登录账号 登录后ÿ…...
【人工智能-agent】--Dify中MCP工具存数据到MySQL
本文记录的工作如下: 自定义MCP工具,爬取我的钢铁网数据爬取的数据插值处理自定义MCP工具,把爬取到的数据(str)存入本地excel表格中自定义MCP工具,把爬取到的数据(str)存入本地MySQ…...
ctfshow——web入门351~356
SSRF没有出网的部分 web入门351 $ch curl_init($url); 作用:初始化一个 cURL 会话,并设置目标 URL。解释: curl_init($url) 创建一个新的 cURL 资源,并将其与 $url 关联。这里的 $url 是用户提供的,因此目标地址完全…...
堆复习(C语言版)
目录 1.树的相关概念: 2.堆的实现 3.TopK问题 4.总结 1.树的相关概念: 1.结点的度:一个结点含有的子树(孩子)个数。 A的度为6 2.叶结点or终端结点:度为0的结点。 J、K、L、H、I 都是叶子结点 3.非终端结…...
解决LangChain4j报错HTTP/1.1 header parser received no bytes
问题描述 当使用langchain4j-open-ai调用自己部署的大模型服务时报错: public static void main(String[] args) {OpenAiChatModel model OpenAiChatModel.builder().apiKey("none").modelName("qwen2.5-instruct").baseUrl("http://19…...
深入解析MySQL联合查询(UNION):案例与实战技巧
在数据库操作中,查询是最常用的操作之一。MySQL提供了强大的查询功能,联合查询(UNION)是其中非常有用的一项操作。联合查询可以将多个查询结果合并成一个结果集,使得从不同来源的数据整合变得更加简单高效。本文将详细…...
[计算机科学#14]:数据结构
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:数据结构是计算机科学中的核心概念,用于…...
【计算机网络】HTTP 协议
HTTP是什么? HTTP 全称是“超文本传输协议”,是互联网上应用最广泛的应用层协议,用于客户端和服务器之间的通信。 HTTP 的实现在 HTTP 3.0之前都是基于传输层的 TCP 实现的, HTTP 3.0 改为了基于 UDP 实现,但是现在市…...
原生的 XMLHttpRequest 和基于 jQuery 的 $.ajax 方法的异同之处以及使用场景
近期参与一个项目的开发,发现项目中的ajax请求有两种不同的写法,查询了下两种写法的异同之处以及使用场景。 下面将从以下两段简单代码进行异同之处的分析及使用场景的介绍: // 写法一: var xhr new XMLHttpRequest(); xhr.open…...
横向移动(上)
横向移动(上) 横向移动指的是攻击者在内网中获得初始访问权限之后,通过相关技术扩大敏感数据和高价值资产权限的行为 常见的横向移动的方式 1.通过web漏洞 2.通过远程桌面 3.通过账号密码 4.通过不安全的配置 5.通过系统漏洞 利用远控…...
关于 js:7. 模块化、构建与工具链
一、模块系统:CommonJS、ESM、UMD 模块系统的目标: 将代码拆分为独立的逻辑单元(模块),实现封装、复用、依赖管理。 在 Web 前端/Node 中,因为 JavaScript 起初没有模块机制,因此出现了多个模…...
一次IPA被破解后的教训(附Ipa Guard等混淆工具实测)
一行代码的疏忽,一个默认的类名,一个未混淆的资源路径,都可能成为攻击者入侵的入口。 背景:一次“不值一提”的上线,成了代价惨重的经验 故事的起点很简单:我们给销售部门做了一款小型内部演示 App&#x…...
麒麟系统安装.net core环境变量
本文主要记录在麒麟系统上安装.net core的运行环境,这里使用的是麒麟V10桌面版,后续测试服务器到了之后再使用服务器版进行安装测试。 环境安装 下载 这里由于是桌面版,我直接使用浏览器下的包,下完之后在终端中安装。 安装 1…...
如何使用 React Hooks 替代类组件的生命周期方法?
文章目录 1. 引言2. useEffect 概述3. 模拟类组件的生命周期方法3.1 模拟 componentDidMount3.2 模拟 componentDidUpdate3.3 模拟 componentWillUnmount 4. 多个 useEffect 的使用5. 注意事项6. 总结 1. 引言 在 React 16.8 版本之前,开发者主要通过类组件&#x…...
windows 在安装 Ubuntu-20.04 显示操作超时解决办法
1. 问题概述与原因分析 在我们用下面命令安装 Ubuntu-20.04 时系统显示操作超时: wsl --install -d Ubuntu-20.04大概率是没打开 Windows 虚拟机监控程序平台,可以在控制面板–>程序和功能里面打开 2. 解决办法与步骤 解决方式如下: 我…...
Spring Boot中Redis序列化配置详解
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在使用Spring Boot集成Redis时,序列化方式的选择直接影响数据存储的效率和系统兼容性。默认的JDK序列化存在可读性差、存储空间大等问题&am…...
OpenCV进阶操作:光流估计
文章目录 前言一、光流估计1、光流估计是什么?2、光流估计的前提?1)亮度恒定2)小运动3)空间一致 3、OpenCV中的经典光流算法1)Lucas-Kanade方法(稀疏光流)2) Farneback方…...
2025年渗透测试面试题总结-渗透测试红队面试八(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 渗透测试红队面试八 二百一十一、常见中间件解析漏洞利用方式 二百一十二、MySQL用户密码存储与加密 …...
前端面试高频50个问题,解答
以下是前端面试中常见的50个高频问题及其简要解答: HTML HTML5 有哪些新特性? 语义化标签(如 <header>、<footer>)、多媒体支持(如 <audio>、<video>)、本地存储(如 l…...
Elasticsearch架构原理
1、Elasticsearch的节点类型 1.1 Master节点 在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后 使用Zen Discovery机制找到集群中的其他节点,并建立连接。 discovery.seed_hosts: ["192.168.21.130", &qu…...
前端面试宝典---webpack面试题
webpack 的 tree shaking 的原理 Webpack 的 Tree Shaking 过程主要包含以下步骤: 模块依赖分析:Webpack 首先构建一个完整的模块依赖图,确定每个模块之间的依赖关系。导出值分析:通过分析模块之间的 import 和 exportÿ…...
Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践
Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践 一、Tailwind CSS 配置 1. 安装依赖 npm install tailwindcssnpm:tailwindcss/postcss7-compat tailwindcss/postcss7-compat postcss^7 autoprefixer^92. 创建配置文件 npx tailwindcss init3. 创建样式文件 在…...
hiveserver2与beeline进行远程连接hive配置及遇到的问题
1、hiveserver2 参与用户模拟功能,因为开启后才能保证各用户之间的权限隔离。 1.1、配置 $HADOOP_HOME/etc/hadoop/core-site.xml <!--配置所有节点的root用户都可作为代理用户--> <property><name>hadoop.proxyuser.root.hosts</name>&…...
单词短语0512
当然可以,下面是“opportunity”在考研英语中的常用意思和高频短语,采用大字体展示,便于记忆: ✅ opportunity 的考研常用意思: 👉 机会,良机 表示有利的时机或条件,尤指成功的可能…...
c++刷题便捷函数(类似于stoi的小函数)
标题 stoi(字符串转整形)map和set都有count成员函数,返回值是该key的个数,可以用来查是否存在该元素。bool is_sorted(nums.begin(), nums.end() 检验是否有序INT_MAX,INT_MIN分别是整形最大和最小初始化二维矩阵 vector<vector\<int>> mart…...
想实现一个基于MCP的pptx生成系统架构图【初版实现】
技术栈:Python + MCP协议 + python-pptx + FastMCP 核心创新点:通过MCP协议实现PPTX元素的动态化生成与标准化模板管理 当前还是个半成品,后续持续更新。 主要先介绍一下思路。 一、MCP协议与系统设计原理 1.1 为什么选择MCP? 标准化工具调用:通过MCP将PPTX元素生成逻辑封…...
jwt学习
基于token的鉴权机制也是无状态的(类似于http协议),不需要保在服务端保留用户的认证或会话信息。 构成 jwt由三部分构成:头部、payload、签名,中间用.隔开 头部(header) 包含两部分信息:声明类型、声明加密的算法 例如:…...
pth的模型格式怎么变成SafeTensors了?
文章目录 背景传统模型格式的安全隐患效率与资源瓶颈跨框架兼容性限制Hugging Face 的解决方案:SafeTensors行业与社区的推动SafeTensors 的意义总结 背景 最近要找一些适合embedding的模型,在huggingface模型库上看到一些排名比较靠前的,准…...
如何判断IP是否被平台标记
一、基础检测:连通性与黑名单筛查 网络连通性测试 Ping与Traceroute:通过命令测试延迟和路由路径,若延迟>50ms或存在异常节点(如某跳延迟>200ms),可能影响可用性。示例命令: bash ping 8.…...
【c++】异常详解
目录 C语言处理错误的局限性异常的定义异常的具体使用细则异常的抛出与捕获在函数调用链中异常栈展开匹配原则异常的重新抛出异常规范throw(类型)noexcept 成熟的异常体系c自己的异常体系异常的优缺点优点缺点 异常安全 C语言处理错误的局限性 C语言处理错误常常会用到assert和…...
从模型加密到授权交付,CodeMeter赋能3D打印商业化全流程
引言 在数字化制造快速演进的当下,3D 打印(增材制造)作为具备高度灵活性与创新潜力的制造方式,正重塑备件供应链与产品生命周期管理。然而,随着应用场景不断扩展,企业面临的知识产权保护、数字资产商业化与…...
ESP32开发之freeRTOS的事件组
什么是事件组事件组的应用场景事件组的API函数事件组应用举例总结什么是事件组 概念:事件组就是一个整数,高8位给内核使用,其他位用来表示事件。在ESP32的IDF freeRTOS中,这个整数是32位的,低24位用来供事件组使用。 举一个生活中的例子: 你在等快递,有三个包裹来自不…...
K8S中构建双架构镜像-从零到成功
背景介绍 公司一个客户的项目使用的全信创的环境,服务器采用arm64的机器,而我们的应用全部是amd64的,于是需要对现在公司流水线进行arm64版本的同步镜像生成。本文介绍从最开始到最终生成双架构的全部过程,以及其中使用的相关配置…...
腾讯怎样基于DeepSeek搭建企业应用?怎样私有化部署满血版DS?直播:腾讯云X DeepSeek!
2025新春,DeepSeek横空出世,震撼全球! 通过算法优化,DeepSeek将训练与推理成本降低至国际同类模型的1/10,极大的降低了AI应用开发的门槛。 可以预见,2025年,是AI应用落地爆发之年! ✔…...
【论信息系统项目的质量管理】
论信息系统项目的质量管理 前言一、抓好质量管理规划工作,为质量管理和确认提供指南和方向。二、做好管理质量相关工作,促进质量过程改进。三、抓好控制质量,确保实现质量目标四、综合协调质量与成本、进度、范围的关系总结 前言 为解决日常出…...
SpringAI框架中的RAG模块详解及应用示例
SpringAI框架中的RAG模块详解及应用示例 RAG(Retrieval-Augmented Generation)可以通过检索知识库,克服大模型训练完成后参数冻结的局限性,携带知识让大模型根据知识进行回答。SpringAI框架提供了模块化的API来支持RAG࿰…...
图像增强技术
一、目的 通过本实验加深对数字图像增强操作的理解,熟悉MATLAB中的有关函数;了解直方图均衡化和卷积滤波的原理;熟悉低通和高通滤波模板的构造方法。 二、实验内容与设计思想 1、观察实验结果可看出, 原图像 I的对比度较低&…...
【Java学习笔记】多态参数
多态参数 应用:方法定义的形参类型为父类类型,实参允许为子类类型 // 父类 package polyparemeter;public class employee {private String name;private double salary;//构造器public employee(){}public employee(String name, double salary) {thi…...
计算机网络核心技术解析:从基础架构到应用实践
计算机网络作为现代信息社会的基石,承载着全球数据交换与资源共享的核心功能。本文将从网络基础架构、核心协议、分层模型到实际应用场景,全面解析计算机网络的核心技术,并结合行业最新趋势,为读者构建系统的知识体系。 一、计算机…...
LiveData:Android响应式编程的核心利器
LiveData是一种可观察的数据持有类,用于在Android应用中实现数据的响应式编程。它具有以下特点和作用: 特点 生命周期感知:LiveData能够感知与其关联的组件(如Activity、Fragment)的生命周期状态。只有当组件处于活跃状态(如Activity处于RESUMED状态)时,LiveData才会将…...
【LeeCode】1.两数之和
文章目录 1. 暴力求解2. 哈希表具体过程1. nums [2, 7, 11, 15],target 9:2. nums [11, 15, 2, 7], target 9 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数ÿ…...
继承关系下创建对象的具体流程
public class Person {int x initX(); // 显式初始化:调用方法 initX()public Person() {System.out.println("Parent 构造器执行, x " x);}int initX() {System.out.println("initX() 被调用了");return 100;} }public class Child extends…...
基于世界土壤数据库(HWSD)的中国土壤数据集(v1.1)(2009)
时间分辨率:年共享方式:开放获取数据大小:156.47 MB数据时间范围:2009元数据更新时间:2020-03-26 数据集摘要 数据来源于联合国粮农组织(FAO)和维也纳国际应用系统研究所(IIASA)所构建的世界土…...