基于 MAUI Blazor 与 C++ DLL 的 ImGui 集成方案
本文介绍如何在 MAUI Blazor 应用中集成 C++ 编写的 ImGui (DirectX 11) 窗口, 只是一个简单的DEMO实现,可能还存在线程阻塞等问题,目前只初步测试了互通信和传递数据的功能。
项目架构
项目包含两个核心模块: ImGuiDX11DLL (C++ Native DLL) 和 ImGuiMauiApp (.NET MAUI 应用)。DLL 封装 ImGui 窗口初始化、渲染循环及 Win32/DirectX 11 资源管理;MAUI 应用通过 P/Invoke 调用 DLL 并控制窗口生命周期。
DLL 接口设计
extern "C" {
IMGUI_DLL_API bool ImGuiDLL_Init(int
width, int height);
IMGUI_DLL_API void ImGuiDLL_Shutdown();
IMGUI_DLL_API void ImGuiDLL_Render();
IMGUI_DLL_API bool ImGuiDLL_IsRunning
();
IMGUI_DLL_API void ImGuiDLL_SendText
(const wchar_t* text);
IMGUI_DLL_API float
ImGuiDLL_GetSliderValue();
}
P/Invoke 封装
C# 端通过 DllImport 声明 DLL 函数,使用 CallingConvention.Cdecl 匹配 C++ 调用约定。数据传递采用宽字符字符串 ( CharSet.Unicode )。

渲染线程管理
渲染循环运行在独立的 LongRunning Task 中,通过 CancellationTokenSource 控制启停。关闭时先设置 _isRunning=false ,再取消 Token,最后等待任务完成(超时 2 秒),避免 UI 线程阻塞。
关键代码片段
_renderTask = Task.Factory.StartNew
(RenderLoop, TaskCreationOptions.
LongRunning);
private void Shutdown() {
lock(_lock) {
_isRunning = false;
_cts?.Cancel();
}
_renderTask?.Wait(2000); // 非阻塞等待
}
运行说明
编译后 ImGuiMauiApp.exe 同目录下需包含 ImGuiDX11DLL.dll 。运行应用后点击按钮即可打开 ImGui 窗口,文本框输入会实时传递至 ImGui UI 显示。
总结
该方案实现了 .NET MAUI 与原生 C++ ImGui 的双向通信,渲染线程与 UI 线程解耦,关闭窗口时不会导致宿主程序崩溃。
本文来自博客园,作者:MTony,转载请注明原文链接:https://www.cnblogs.com/wecareu/p/19744221/maui-blazor-cpp

浙公网安备 33010602011771号