All packages share one version number: <Dear ImGui version>.<library revision>.
For example 1.93.0.1 is the first revision of the bindings for Dear ImGui
1.93.0. The revision is bumped by hand whenever a package is republished without
moving to a new Dear ImGui tag.
C++ reference parameters are now in / ref instead of nullable pointers.
This is the breaking change in this release: call sites pass in x where they
used to pass &x.
const T&becomesin T,T&becomesref T. Both pass the address, so the ABI is unchanged, but neither acceptsnull, which turns the mistake that used to be a runtime access violation into a compile-time error. Two crashes in theimgui_clubport were exactly this:Button("Options", null)andBeginChild("##scrolling", null, ...)passed null to aconst ImVec2&that Dear ImGui dereferences unconditionally.- Defaults are preserved. A C++ default of
ImVec2(0, 0)becomesin ImVec2 size = default; a non-zero one (Image'suv1 = ImVec2(1, 1),ProgressBar'ssize_arg = ImVec2(-FLT_MIN, 0)) becomes astatic readonlyfield plus a forwarding overload, so omitting the argument keeps the upstream meaning instead of silently zeroing it. - The defaults are read from
imgui/*.hat generation time, keyed by the whole parameter list, so two overloads of the same function cannot leak values into each other (Imagehas a 4-argument and a 6-argument form).
Drops net8.0, adds macOS support, and removes ImGui4NET.Backend.Null.
- Target framework is now
net10.0only.net8.0is gone from every package, so a project on .NET 8 can no longer reference them. This is a breaking change for consumers who had not moved to .NET 10. - The Windows-only backends (
DirectX9,DirectX11,DirectX12,Win32) used to ship onlynet8.0-windows/net10.0-windows. They now shipnet10.0-windowsand a plainnet10.0asset: a project that sets<TargetFramework>net10.0-windows</TargetFramework>still resolves the Windows build, while a project without a platform qualifier (a cross-compiled tool, anet10.0library, a test project) can reference the package instead of failing with NU1201.- Native libraries for
osx-x64andosx-arm64are now built and shipped. They are cross-compiled from Windows or Linux with clang plusld64.lldagainst a downloaded macOS SDK — no Mac required.tools/fetch-macos-sdk.shfetches the SDK, andtools/generate.sh --macos(also part of--all) drives both architectures.
- Native libraries for
- Backends for macOS:
OpenGL2,OpenGL3,Glut,Metal,Metal4andOSX. GLFW, SDL2/3 and Vulkan need headers that are not part of the SDK. - Fix:
MemoryEditorcrashed with0xC0000005.Button("Options", null)andBeginChild("##scrolling", null, ...)passed a null pointer to aconst ImVec2¶meter, which Dear ImGui dereferences unconditionally. Both now pass a zeroedImVec2, matching whatImGui::Button(label)does in C++. C++ references are generated as nullable pointers, so the compiler could not catch this; a by-reference parameter would bein ImVec2/ref ImVec2instead. Glut.MouseWheelFuncis marked[Obsolete]with an explanation. Dear ImGui declares it unconditionally inimgui_impl_glut.hbut compiles the body only under__FREEGLUT_EXT_H__, which Apple's GLUT framework does not define, so the macOS dylibs export 11 of the 12 declared entry points. One binding assembly serves every RID, so the method stays — calling it on macOS throwsEntryPointNotFoundException, and the attribute makes that a compile-time warning at the call site instead of a runtime surprise.- New package
ImGui4NET.Backend.Metal4. Metal 4 renderer backend forosx-arm64only. Unlike every other backend it recordsminos=26.0(-mmacosx-version-min=26.0), becauseimgui_impl_metal4.mmbindsMTL4RenderPassDescriptorandMTL4CommandQueue, bothAPI_AVAILABLE(macos(26.0)), without a runtime guard. Building it with the usual 11.0 floor would only silence the availability warnings and produce a dylib that dyld accepts on macOS 11 and then fails to resolve. TheOBJC_BACKENDStable intools/generate.shtherefore carries a per-backend deployment target and architecture list; x64 is skipped even though it links. - Method names in the Objective-C++ backends drop their C prefix like every
other backend (
ImGui_ImplMetal4.Init, notImGui_ImplMetal4.ImGui_ImplMetal4_Init), and a C++boolreturn stays abyteinstead of being wrapped into a managedbool, matching the rest of the repository. There are no_nativewrappers anywhere either: theDllImportmethod itself is the public API, with the handle types taken by value. ImGui4NET.Clubis now a pure C# port. The three extensions define every method inside their class body, so ClangSharp emitted the struct layout but no externs, and forcing the inline bodies out of a native library needed a dedicated instantiation unit,-fkeep-inline-functions,-O0and, on Clang,-femit-all-decls. Since all three only ever call the public Dear ImGui API, they are reimplemented in C# instead:MemoryEditor,MultiContextCompositor,ImDrawDataSnapshotandImTextureQueue.tools/club-instantiate.cpp,ClubNative.cs, the generated layout files and theruntimes/folder are gone;generate.shprintsimgui_club: pure C# port, nothing to generate. This also removes one native library per RID from the package.ImVectorUtilreproducesImVector<T>'sreserve/resize/push_back/swap/clearagainstImGui.MemAlloc/MemFree, because a draw list buffer allocated by the CLR cannot be handed back to Dear ImGui.ImTextureQueue's per-texture records stay in native memory: their address is stored inImTextureData.QueueUserDataand dereferenced by the render thread.ImDrawDataSnapshotreuses one key buffer instead of allocating a newuint[]on everyNewFrame, so the steady-state snapshot path is allocation-free.
MetalandOSXare Objective-C++. Their bindings come fromtools/gen-objc-backend.sh, which parses with-x objective-c++and hands the header topostprocess.py --macho-symbols: a Mach-O symbol table stores every C symbol with a leading underscore, butdlsym()expects the C spelling, so the extra underscore is removed fromEntryPointwhile the_Z…mangling is left intact. Objective-C handles (id<MTLDevice>,NSView) becomereadonly structvalue types carrying only the pointer, so theDllImporttakes them by value: no wrapper method, no marshalling, and one null value (NSView.Null) for parameters the header marks_Nullable.- The backend-to-core dependency is recorded as
@loader_path/libimgui.dylib, so each backend resolves the core library from its ownruntimes/<rid>/nativefolder. tools/lp64-aliases.pylearned to read Mach-O symbol tables directly (GNUnmcannot) and to emit an assembly alias file, becauseld64.lld -aliascannot bind to a symbol defined by an object file. x64 needs 46 aliases, arm64 needs 29 —va_listmangles differently between the two.- The Null backend was a headless platform stub that no published package
depends on and that the sample never used. Keeping it meant building,
packing and shipping three native libraries for a backend nobody consumes, so
the project, its generated bindings and its native binaries are gone and
tools/generate.shno longer emits them. - Backend packages are now 17 instead of 15 (Metal 4 added, Null removed).
Replaces the 1.93.0.2 workaround with real C++ defaults, and fixes a crash
caused by by-reference parameters whose default was null.
-
Binding fix: ClangSharp emits C++ reference parameters such as
SetNextWindowPos'spivotasImVec2* pivot = null. A C# default argument must be a compile-time constant, so a pointer cannot carry the C++ value, and= nullmade the native code dereference a null pointer (0xC0000005).tools/postprocess.pynow parses the defaults out ofimgui.hand emits each one as astatic readonlyfield plus a forwarding overload, so the native value is preserved exactly:ProgressBar'ssize_argkeepsImVec2(-FLT_MIN, 0)— "fill the available width". TreatingFLT_MINasFLT_MAXwould have changed the layout.Image'suv0/uv1keepImVec2(0, 0)andImVec2(1, 1).ImageWithBg/ImageButton'sbg_col/tint_colkeepImVec4(0,0,0,0)andImVec4(1,1,1,1).
Unlike 1.93.0.2, existing call sites keep compiling: the parameter is still a pointer in the extern, and omitting it now forwards to the C++ default instead of passing null. Parameters the native side genuinely null-checks (
IsMousePosValid'smouse_pos,DockSpace'swindow_class,RenderTextClipped'sclip_rect) keep= null. -
The sample dashboard gained a README with screenshots, Microsoft YaHei font loading for CJK text, and PNG screenshot capture (
--screenshot,F12). -
The sample's frame loop measures time with a monotonic clock; OpenTK's
FrameEventArgs.Timecould stall and freeze every animation. -
CI skips build-only runs for documentation changes, except
docs/PACKAGE-README.md, which is packed as the NuGet README.
Superseded by 1.93.0.3. Removed the default from by-reference parameters, which fixed the crash but broke call sites and discarded the C++ default values.
First public release.
- Bindings for Dear ImGui
v1.93.0-docking, includingimgui_internal.h. - Native libraries for
win-x64,linux-x64andandroid-arm64. - Core package plus 15 backend packages (platform and renderer) and
ImGui4NET.Clubfor theocornut/imgui_clubextensions. - Targets
net8.0andnet10.0; Direct3D and Win32 backends targetnet8.0-windowsandnet10.0-windows. - Trim- and NativeAOT-compatible: the bindings contain no reflection.