基于 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 )。

4c1f668f97504e85a237028e50af2200

 

渲染线程管理

渲染循环运行在独立的 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 线程解耦,关闭窗口时不会导致宿主程序崩溃。

 

posted @ 2026-03-20 15:29  MTony  阅读(3)  评论(0)    收藏  举报