DotNetDupe 4.0.7
dotnet add package DotNetDupe --version 4.0.7
NuGet\Install-Package DotNetDupe -Version 4.0.7
<PackageReference Include="DotNetDupe" Version="4.0.7" />
<PackageVersion Include="DotNetDupe" Version="4.0.7" />
<PackageReference Include="DotNetDupe" />
paket add DotNetDupe --version 4.0.7
#r "nuget: DotNetDupe, 4.0.7"
#:package DotNetDupe@4.0.7
#addin nuget:?package=DotNetDupe&version=4.0.7
#tool nuget:?package=DotNetDupe&version=4.0.7
DotNetDupe π
Ever admired the elegance and developer-friendliness of .NET APIs? π€ While the C++ Standard Template Library (STL) is powerful, its learning curve can be steep. This project, DotNetDupe, bridges that gap! π
Inspired by the clear and concise API design of C# .NET, DotNetDupe is a C++ library that brings a familiar, streamlined development experience to your C++ projects. β¨
Latest Published Version (): Comprehensive documentation, API reference updates, Pimpl ABI stability, and refined packaging! π Key highlights include:
- β‘ First-Class C#
EventHandler<TEventArgs>&EventArgsModel: Idiomatic C# .NET event-driven delegate system with multicast subscription (+=,-=), member method binding (Add(pInstance, &Class::Method)), token-based unsubscription, and thread-safe dispatch. - π₯ Modernized
FileDownloader: Upgraded download callbacks to typed multicastEventHandler<DownloadProgressChangedEventArgs>andEventHandler<DownloadCompletedEventArgs>with reliableFileModecreation and resumption. - π Observable
ProcessStreamerModernization: Multicast event streams (ProcessDiscovered,BatchReady,ProcessUpdated,Completed,Error) with two-tier progressive telemetry streaming and thread-safe cancellation. - β±οΈ First-Class Process Discovery (
Process::GetProcesses): Native ultra-fast (< 5ms) discovery snapshots viaProcess::GetProcesses(),Process::GetProcessById(), andProcess::GetProcessesByName()matching .NET BCL, with on-demand per-process deep enrichment viaSystemMetrics::EnrichProcessInfo(). - π’ Version String Parsing (
Version::Parse&Version::TryParse): Strict, .NET-compliant string parsing supporting 2, 3, and 4-component version formats with full error validation. - π‘οΈ Zero Header STL Dependencies: Completely refactored public headers to eliminate STL dependencies from public interfaces, ensuring clean ABI boundaries and library-centric types across
String,Collections,IO,Net,Logging, andData. - π¦ Core Data Structures & Collections Overhaul: Pure library implementations for
List<T>,Dictionary<K, V>,HashSet<T>,Queue<T>,Stack<T>,PriorityQueue<T>,SortedDictionary<K, V>,SortedSet<T>, andLinkedList<T>. - β‘ Thread-Safe Concurrent Collections (
System::Collections::Concurrent): Lock-free/fine-grained thread-safe data structures includingConcurrentDictionary,ConcurrentQueue,ConcurrentStack,ConcurrentBag, andBlockingCollection. - π Real-Time Telemetry & System Metrics (
System::Diagnostics::SystemMetrics): Real-time monitoring of system hardware metrics (CPU load %, memory usage, disk throughput, network bandwidth, and active processes). - π ETW & Enterprise Event Logging (
System::Diagnostics::EtwLogReader&EventLog): High-performance Event Tracing for Windows (ETW) and Linux Syslog channel enumeration, querying, and live subscription listening. - π₯οΈ Terminal & User Sessions (
System::Diagnostics::TerminalSession&ActiveUserSession): Enumerate local, disconnected, and remote desktop (RDP) Terminal Services user sessions. - π Console I/O Redirection: Standard stream redirection via
Console::SetOut,Console::SetError, andConsole::SetInusingSmartPointer. - ποΈ LoggerTextWriter Log Redirector: Bridge standard
TextWriterstream calls directly intoLogManagerlogging providers without per-call lookup overhead. - π·οΈ Global LogManager: Thread-safe category logger caching and static factory via
LogManager::GetLogger("Category")andLogManager::GetLogger<T>(). - π² Recursive Directory Creation: Overloaded
Directory::CreateDirectory(path, recursive)to automatically construct missing parent directory structures. - π Resilient File Logging: Enhanced
FileLoggerProviderto resolve relative log paths to full paths and auto-create missing log directories. - π§© ServiceCollection DI Enhancements: Improved lifetime management and container registration.
This project is a living example of how persistent human effort during weekends and late evenings can build a system from scratch using AI. DotNetDupe has grown far beyond a foundational set of classes into a comprehensive, multi-platform C++ Base Class Library offering extensive modern capabilities across System, IO, Collections, Net, Threading, Logging, Data, and Hosting. If anyone wants to join hands, you are most welcome in the form of PRs, issues or comments π
A fun fact: While I personally crafted core components like Char, String, and Path (along with their tests), the rest of the system was collaboratively designed, built, and expanded by myself and my peer Antigravity. π€ This project serves as a unique playground for exploring how generative AI can accelerate development from scratch. π
DotNetDupe aims to simplify C++ development by providing C#-like interfaces for common tasks, making your code more concise, intuitive, and a joy to write. π
Table of Contents π
- DotNetDupe π
- Table of Contents π
- Project Overview π‘
- Features β¨
- Getting Started π
- Cross-Platform Support π
- WSL Setup Guide (Windows) π§
- Developing Cross-Platform Applications ππ»
- Usage π»
- Web API & Database Integration Guide πποΈ
- STL vs DotNetDupe Comparison βοΈ
- API Reference π
- Project Status π§
- Contributions π
- CI/CD Pipeline π
- License π
- Generated Content π€
- Contact π§
Project Overview π‘
The core objective of DotNetDupe is to bridge the gap between the power and performance of C++ and the ease of use and productivity offered by C# APIs. By providing C#-like interfaces for common programming tasks, DotNetDupe aims to:
- Simplify C++ Development: Reduce the boilerplate and complexity often associated with STL, making C++ more approachable for developers accustomed to higher-level languages.
- Enhance Readability: Promote cleaner and more readable code by adopting well-known C# API patterns.
- Boost Productivity: Accelerate development cycles by offering intuitive and efficient tools for common operations.
Features & Library Capabilities β¨
DotNetDupe has evolved into a feature-rich, multi-platform C++20 Base Class Library (BCL) offering an extensive suite of modern capabilities:
π§ Memory & Object Management (
System):SmartPointer<T>: Exception-safe RAII reference-counted smart pointer withNewShared()andNewUnique()factory helpers.- Base
Objecttype system withToString(),GetType(),Equals(), andGetHashCode().
β‘ Delegates & Event Model (
System):EventHandler<TEventArgs>: Multicast event delegate supporting lambda, free function, and member method binding withoperator+=, token unsubscription withoperator-=, and FIFO invocation.EventArgs: Base class for event data payloads withEventArgs::Empty()singleton.
π€ String Manipulation & Utilities (
System::String):- Full-featured
String&WStringwith UTF-8 / UTF-16 cross-transcoding. - Methods:
Format(),Split(),Join(),Replace(),Contains(),StartsWith(),EndsWith(),Trim(),PadLeft(),PadRight().
- Full-featured
π¦ Generic Collections (
System::Collections::Generic):- Type-safe container wrappers:
List<T>,Dictionary<K, V>,Queue<T>,Stack<T>,HashSet<T>, andKeyValuePair<K, V>.
- Type-safe container wrappers:
π File I/O & System Services (
System::IO):- High-level static primitives:
File(ReadAllText,WriteAllText,AppendAllText,Exists,Delete) andDirectory(CreateDirectory(path, recursive),Exists,EnumerateFiles). - Cross-platform path calculations:
Path(Combine,GetFullPath,GetDirectoryName,GetFileName,GetExtension). - Stream & Reader/Writer hierarchy:
FileStream,MemoryStream,BufferedStream,StreamReader,StreamWriter,BinaryReader,BinaryWriter,StringReader,StringWriter.
- High-level static primitives:
π Console & Stream Redirection (
System::Console):- Rich console text & background color controls (
SetForegroundColor,SetBackgroundColor,ResetColor). - Full stream redirection via
SetOut(),SetError(), andSetIn()acceptingSmartPointer<TextWriter>andSmartPointer<TextReader>.
- Rich console text & background color controls (
π² Enterprise Logging & Diagnostics (
Extensions::Logging):- Structured & Plaintext logging (
ILogger,ILoggerProvider,LoggerFactory). - Formats: Custom plaintext layout templates & JSON structured payloads with key-value metadata properties.
- Providers:
ConsoleLoggerProviderandFileLoggerProviderwith automatic relative path resolution & recursive parent directory creation. LogManager: Category logger caching factory (GetLogger("Category"),GetLogger<T>(),GetConsoleLogger,GetFileLogger).LoggerTextWriter: High-performance stream redirector bridgingTextWriteroutput intoLogManager.
- Structured & Plaintext logging (
π§΅ Multi-Threading & Process Management (
System::Threading/System::Diagnostics):- Thread lifecycle (
Thread), high-throughputThreadPool, and task parallelism (Task,Task<T>). - Synchronization primitives:
Mutex,AutoResetEvent,ManualResetEvent,EventWaitHandle,CriticalSection,ReaderWriterLockSlim. - Process orchestration & telemetry:
Process,ProcessStartInfo, and progressive streaming viaProcessStreamer/ProcessStreamOptions.
- Thread lifecycle (
π Networking, HTTP & Web App Hosting (
System::Net/Extensions::Hosting):- Low-level socket abstractions (
TcpClient,TcpListener,UdpClient,Socket). - Full-duplex WebSockets:
WebSocket,WebSocketState,WebSocketException,WebSocketError(RFC 6455). - High-level HTTP client:
HttpClient,HttpRequestMessage,HttpResponseMessage,HttpContent,StringContent,ByteArrayContent. - SSL/TLS security:
SslStreambacked by OpenSSL. - Embedded Web Server & Hosting:
WebAppServerandHostBuilderfor serving static Web UI files and REST API controllers.
- Low-level socket abstractions (
π Dependency Injection (
Extensions::DependencyInjection):- Full-featured DI container (
ServiceCollection,ServiceProvider,ServiceDescriptor). - Lifetimes:
Transient,Scoped,Singleton.
- Full-featured DI container (
π Security & Principal (
System::Security::Principal):UserPrincipalandWindowsIdentityfor cross-platform OS user enumeration and privilege inspection.
β‘ Database Data Access (
System::Data):- Abstract ADO.NET-style data provider interfaces (
IDbConnection,IDbCommand,IDataReader,IDataParameterCollection).
- Abstract ADO.NET-style data provider interfaces (
Getting Started π
Prerequisites π
- C++17 / C++20 compatible compiler (e.g., MSVC v143, GCC 11+, Clang 13+)
- CMake 3.15+ (for building on Linux / WSL)
- OpenSSL / SSL Runtime Dependencies:
- Windows: The NuGet package bundles pre-built OpenSSL runtime binaries (
libssl-4-x64.dll,libcrypto-4-x64.dllfor x64, andlibssl-4.dll,libcrypto-4.dllfor x86) which are automatically copied into the target build output directory via MSBuild.targets. - Linux: Requires system OpenSSL 3.x / 1.1.x runtime libraries (
libssl.so,libcrypto.so). Install viasudo apt-get install -y libssl-dev(Ubuntu/Debian) orsudo dnf install -y openssl-devel(Fedora/RHEL).
- Windows: The NuGet package bundles pre-built OpenSSL runtime binaries (
Installation β¬οΈ
Clone the repository:
git clone https://github.com/sudheeshps/DotNetDupe.git cd DotNetDupeBuild the solution and generate NuGet package: Run the automated build script from PowerShell:
.\BuildAndPack.ps1This script will update the resource build timestamp, compile the x64 and x86 Release binaries, and output the NuGet package (
DotNetDupe.4.0.7.nupkg) into thenuget_packagesdirectory.Add local NuGet package source: To use the locally generated NuGet package, add the
nuget_packagesdirectory as a local NuGet source:nuget sources Add -Name "DotNetDupeLocal" -Source "D:\Personal\Projects\C++\DotNetDupe\nuget_packages"(Replace
D:\Personal\Projects\C++\DotNetDupewith your actual solution root path.)Install the NuGet package in your project: In your C++ project, you can now install the
DotNetDupepackage using the NuGet Package Manager or the command line:nuget install DotNetDupe -OutputDirectory <YourProjectDirectory> -Source DotNetDupeLocal(Replace
<YourProjectDirectory>with the path to your project where you want to install the package.)Integrate into your project: Once installed, ensure your project's
.vcxprojfile is configured to link against theDotNetDupe.liband include its headers. The NuGet package's.targetsfile should handle most of this automatically.
Cross-Platform Support π
DotNetDupe is designed for high portability and officially supports Windows (via MSVC/MSBuild) and Linux (via GCC/Clang/CMake).
Building and Testing
| Platform | Build System | Build Command | Test Command |
|---|---|---|---|
| Windows | MSBuild | msbuild DotNetDupe.sln /p:Configuration=Release |
.\bin\x64\Release\DotNetDupeTests.exe |
| Linux / WSL | CMake | cmake -S . -B build && cmake --build build |
cd build && ctest |
Integration via NuGet
DotNetDupe is distributed as a multi-platform NuGet package. It contains native binaries for:
win-x64(DotNetDupe.dll,libssl-4-x64.dll,libcrypto-4-x64.dll)win-x86(DotNetDupe.dll,libssl-4.dll,libcrypto-4.dll)linux-x64(libDotNetDupe.so)
When you add the NuGet package to your project, the appropriate binary and dependencies are automatically selected based on your target platform.
SSL Runtime Dependencies
- Windows: Dynamic OpenSSL dependencies (
libssl-4-x64.dll&libcrypto-4-x64.dll) are packaged directly inside the NuGet package and deployed next toDotNetDupe.dllat build time. - Linux: Dynamically links against standard host OpenSSL libraries (
libssl.so.3/libssl.so.1.1). Ensure OpenSSL is installed on target runtime hosts (apt-get install libssl3orlibssl1.1).
Note for Linux Users
On Linux, NuGet packages are typically managed via dotnet CLI or integrated into CMake projects using tools like vcpkg or by manually extracting the shared library (.so) and headers from the .nupkg (which is a ZIP file).
Example manual extraction:
unzip DotNetDupe.nupkg -d dotnetdupe_lib
# Use dotnetdupe_lib/include for headers
# Use dotnetdupe_lib/runtimes/linux-x64/native/libDotNetDupe.so for linking
WSL Setup Guide (Windows) π§
For Windows developers who want to build and test for Linux locally, we recommend using the Windows Subsystem for Linux (WSL).
1. Install WSL
If you haven't already, install Ubuntu via PowerShell:
wsl --install -d Ubuntu
2. Environment Provisioning
Inside your WSL terminal, install the C++ build chain and OpenSSL development headers:
sudo apt-get update
sudo apt-get install -y build-essential cmake libssl-dev pkg-config
3. Build & Test in WSL
Navigate to your project root (e.g., /mnt/d/Projects/DotNetDupe) and run:
# Create build directory
mkdir -p build-wsl && cd build-wsl
# Configure and Build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
# Run Tests
ctest --output-on-failure
4. Running WSL Commands from PowerShell
You can also build and test for Linux directly from a Windows PowerShell terminal without manually entering the WSL shell:
# Create build directory
wsl -d Ubuntu -- bash -c "mkdir -p build-wsl"
# Configure
wsl -d Ubuntu -- bash -c "cd build-wsl && cmake .. -DCMAKE_BUILD_TYPE=Release"
# Build
wsl -d Ubuntu -- bash -c "cd build-wsl && cmake --build ."
# Run Tests (via CTest)
wsl -d Ubuntu -- bash -c "cd build-wsl && ctest"
# Run Tests (direct execution)
wsl -d Ubuntu -- bash -c "cd build-wsl && ./DotNetDupeTests"
# Run Demo Application
wsl -d Ubuntu -- bash -c "cd build-wsl && ./DotNetDupeDemo"
Developing Cross-Platform Applications ππ»
DotNetDupe enables unified, cross-platform C++20 development across Windows (MSVC / MSBuild) and Linux (GCC/Clang via CMake or WSL).
1. Cross-Platform Project Architecture
When building a cross-platform application with DotNetDupe:
- Use UTF-8 character encoding for cross-platform portability.
- Rely on
DotNetDupe::System::SmartPointer<T>for memory and resource cleanup. - Avoid platform-specific raw syscalls; use DotNetDupe abstractions like
System::IO::Path,System::IO::File,System::Threading::Thread, andSystem::Net::Sockets::TcpClient.
2. Integrating via NuGet Package
You can package and consume DotNetDupe via NuGet across Windows and Linux (WSL / CMake) projects.
A. Generating the NuGet Package
Run the automated build script from PowerShell:
.\BuildAndPack.ps1
This updates the build timestamp, compiles both x64 and x86 Release binaries, and outputs DotNetDupe.4.0.7.nupkg inside the nuget_packages/ directory.
B. Consuming NuGet Package in Visual Studio (Windows)
- Add the local
nuget_packagesfolder as a NuGet Package Source:nuget sources Add -Name "DotNetDupeLocal" -Source "D:\Personal\Projects\C++\DotNetDupe\nuget_packages" - In Visual Studio, right-click your project β Manage NuGet Packages β Select
DotNetDupeLocalβ InstallDotNetDupe.
C. Consuming NuGet Package on Linux / CMake (WSL)
- Extract
DotNetDupe.4.0.7.nupkg(ZIP format) to a local directory:Expand-Archive -Path "nuget_packages\DotNetDupe.4.0.7.nupkg" -DestinationPath "DotNetDupe_NuGet" -Force - Configure CMake pointing
NUGET_PATHto the extracted package folder:cmake -S . -B build -DUSE_NUGET=ON -DNUGET_PATH="./DotNetDupe_NuGet" cmake --build build
3. Building a Web Application with Static Files & REST APIs
The WebAppServer class serves static website assets (index.html, CSS, JavaScript, images) alongside mapped REST endpoints.
Project Directory Layout
MyWebApp/
βββ wwwroot/
β βββ index.html
β βββ site.css
βββ main.cpp
Step 1: Create wwwroot/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DotNetDupe Web App</title>
<link rel="stylesheet" href="site.css">
</head>
<body>
<h1>DotNetDupe Web Application Server</h1>
<p>Serving static assets and REST API endpoints simultaneously!</p>
<button onclick="fetchWelcomeMessage()">Hit Welcome Endpoint</button>
<p id="welcome-output"></p>
<script>
async function fetchWelcomeMessage() {
const response = await fetch('/api/welcome?name=Developer');
const data = await response.json();
document.getElementById('welcome-output').innerText = data.message;
}
</script>
</body>
</html>
Step 2: C++ Application (main.cpp)
Here is a complete, compile-ready web application hosting index.html and responding with a welcome message on hitting /api/welcome:
#include "System/Console.h"
#include "System/SmartPointer.h"
#include "System/IO/File.h"
#include "System/IO/Path.h"
#include "System/IO/Directory.h"
#include "WebAppCore/Builder/WebApplication.h"
#include "WebAppCore/Builder/WebApplicationBuilder.h"
#include "WebAppCore/Server/WebAppServer.h"
#include "WebAppCore/Http/HttpContext.h"
using namespace DotNetDupe::System;
using namespace DotNetDupe::WebAppCore::Builder;
using namespace DotNetDupe::WebAppCore::Server;
using namespace DotNetDupe::WebAppCore::Http;
int main() {
Console::WriteLine("=============================================");
Console::WriteLine(" Starting DotNetDupe Cross-Platform Web Server");
Console::WriteLine("=============================================");
String webRoot = "wwwroot";
if (!IO::Directory::Exists(webRoot)) {
IO::Directory::CreateDirectory(webRoot, true);
}
// 1. Initialize WebApplication Host Builder
auto builder = WebApplication::CreateBuilder();
auto app = builder->Build();
// 2. Map REST Endpoint (/api/welcome?name=...)
app->MapGet("/api/welcome", [](SmartPointer<HttpContext> ctx) -> String {
String name = "Guest";
if (ctx->GetRequest()->GetQuery().ContainsKey("name")) {
name = ctx->GetRequest()->GetQuery()["name"];
}
ctx->GetResponse()->SetContentType("application/json");
return String("{\"status\":\"Success\",\"message\":\"Welcome to DotNetDupe Web Server, ") + name + "!\"}";
});
// 3. Initialize WebAppServer to serve website content (index.html & assets)
WebAppServer server(app, webRoot);
server.EnableStaticFiles("index.html");
Console::WriteLine("Server running at: http://localhost:8080/index.html");
Console::WriteLine("Welcome Endpoint at: http://localhost:8080/api/welcome?name=Developer");
// 4. Start Server
server.Run("http://localhost:8080/index.html");
return 0;
}
Usage π»
Here are some quick examples of how to use DotNetDupe:
1. Strings, Dates & Console
#include "System/Console.h"
#include "System/String.h"
#include "System/DateTime.h"
#include "System/TimeSpan.h"
#include "System/IO/Path.h"
using namespace DotNetDupe::System;
void DemonstrateBasics() {
// String interpolation / formatting & manipulation
String sGreeting = "Hello";
String sName = "Developer";
String sMessage = String::Format("{0}, {1}! Welcome to DotNetDupe.", sGreeting, sName);
Console::WriteLine(sMessage);
// Cross-platform Path manipulation
String sDocPath = IO::Path::Combine("C:\\Projects", "DotNetDupe", "README.md");
Console::WriteLine("Combined Path: {0}", sDocPath);
Console::WriteLine("Extension: {0}", IO::Path::GetExtension(sDocPath));
// DateTime and TimeSpan operations
DateTime dtNow = DateTime::Now();
DateTime dtTomorrow = dtNow.AddDays(1);
TimeSpan tsDiff = dtTomorrow - dtNow;
Console::WriteLine("Current Time: {0}", dtNow.ToString());
Console::WriteLine("Hours until tomorrow: {0}", tsDiff.GetTotalHours());
}
2. Multi-Threading & Asynchronous Tasks
#include "System/Console.h"
#include "System/Threading/Thread.h"
#include "System/Threading/ThreadPool.h"
#include "System/Threading/Tasks/Task.h"
using namespace DotNetDupe::System;
using namespace DotNetDupe::System::Threading;
using namespace DotNetDupe::System::Threading::Tasks;
void DemonstrateConcurrency() {
// Thread lifecycle
Thread workerThread([]() {
Console::WriteLine("Worker thread running...");
Thread::Sleep(100);
});
workerThread.Start();
workerThread.Join();
// High-throughput ThreadPool queue
ThreadPool::QueueUserWorkItem([]() {
Console::WriteLine("ThreadPool work item executed.");
});
// Async Task Parallelism
auto spTask = Task<int>::Run([]() -> int {
Thread::Sleep(50);
return 42 * 2;
});
spTask->Wait();
Console::WriteLine("Task result: {0}", spTask->GetResult());
}
3. Thread-Safe Concurrent Collections
#include "System/Console.h"
#include "System/Collections/Concurrent/ConcurrentDictionary.h"
#include "System/Collections/Concurrent/ConcurrentQueue.h"
#include "System/Collections/Concurrent/BlockingCollection.h"
using namespace DotNetDupe::System;
using namespace DotNetDupe::System::Collections::Concurrent;
void DemonstrateConcurrentCollections() {
// Thread-safe ConcurrentDictionary
ConcurrentDictionary<String, int> dict;
dict.TryAdd("CPU", 95);
dict.TryAdd("Memory", 60);
dict.GetOrAdd("Disk", 40);
int iUsage = 0;
if (dict.TryGetValue("CPU", iUsage)) {
Console::WriteLine("CPU Usage: {0}%", iUsage);
}
// Thread-safe Producer-Consumer BlockingCollection
BlockingCollection<String> pipeline(100);
pipeline.Add("Packet #1");
pipeline.Add("Packet #2");
String sItem;
if (pipeline.TryTake(sItem)) {
Console::WriteLine("Processed item from pipeline: {0}", sItem);
}
}
Web API & Database Integration Guide πποΈ
This section provides comprehensive examples and recommended practices for hosting web services, consuming them, and using the database storage layer.
1. Hosting REST API Controllers
DotNetDupe provides an ASP.NET-like hosting model with dependency injection and controller-based routing in the WebAppCore namespaces.
Defining and Hosting a Controller
- Declare your data structure.
- Specialize the
JsonConverter<T>for the structure to enable automatic serialization and deserialization. - Inherit from
ControllerBaseand define your action methods. - Bind routes using
ControllerRouteBuilderand map them in the application host.
#include "WebAppCore/Builder/WebApplicationBuilder.h"
#include "WebAppCore/Builder/WebApplication.h"
#include "WebAppCore/Controllers/ControllerBase.h"
#include "System/Collections/Generic/List.h"
using namespace DotNetDupe::System;
using namespace DotNetDupe::WebAppCore::Builder;
using namespace DotNetDupe::WebAppCore::Controllers;
// 1. Declare the data model
struct ProductItem {
String Name;
int Price = 0;
};
// 2. Specialize JsonConverter for serialization/deserialization
namespace DotNetDupe {
namespace System {
namespace Text {
namespace Json {
template <>
struct JsonConverter<ProductItem> {
static JsonElement Write(const ProductItem& value) {
JsonElement obj(JsonValueKind::Object);
obj.SetProperty("name", JsonElement(value.Name));
obj.SetProperty("price", JsonElement(static_cast<double>(value.Price)));
return obj;
}
static ProductItem Read(const JsonElement& element) {
ProductItem p;
JsonElement prop;
if (element.TryGetProperty("name", prop)) p.Name = prop.GetString();
if (element.TryGetProperty("price", prop)) p.Price = prop.GetInt32();
return p;
}
};
}
}
}
}
// 3. Define the controller
class ProductsController : public ControllerBase {
public:
// GET /api/products
Collections::Generic::List<ProductItem> GetProducts() {
Collections::Generic::List<ProductItem> list;
list.Add(ProductItem{"Espresso Machine", 299});
list.Add(ProductItem{"Coffee Grinder", 89});
return list;
}
// POST /api/products
String CreateProduct(const ProductItem& product) {
return Created(String("Added ") + product.Name);
}
};
int main() {
auto builder = WebApplication::CreateBuilder();
// 4. Register and configure routes on the controller
builder->AddController<ProductsController>("/api/products")
.MapGet("", &ProductsController::GetProducts)
.MapPost("", &ProductsController::CreateProduct);
auto app = builder->Build();
app->MapControllers(); // Applies the registered mappings
app->Run("http://127.0.0.1:5000");
}
2. Consuming REST APIs
DotNetDupe makes client-side web requests simple. You can query endpoints using a low-level HTTP client or a strongly-typed REST resource client.
Option A: Low-level HTTP Client (HttpClient)
Best for general, raw request handling, sending custom headers, or performing authentication (like setting Bearer tokens).
#include "System/Net/Http/HttpClient.h"
#include "System/Console.h"
void GetRawData() {
using namespace DotNetDupe::System::Net::Http;
HttpClient client;
// Add default headers (e.g. JWT Auth token)
client.GetDefaultRequestHeaders().Add("Authorization", "Bearer your_token_here");
auto response = client.Get("http://127.0.0.1:5000/api/products");
if (response->GetStatusCode() == 200) {
DotNetDupe::System::String json = response->GetContent()->ReadAsString();
DotNetDupe::System::Console::WriteLine(json);
}
}
Option B: Strongly-Typed Client (RestClient<T>) - Recommended
Best for standard RESTful resources. It handles payload serialization/deserialization to your model structures automatically.
#include "System/Net/Http/RestClient.h"
#include "System/Console.h"
void SyncProducts() {
using namespace DotNetDupe::System::Net::Http;
// Point the RestClient to your resource endpoint
RestClient<ProductItem> client("http://127.0.0.1:5000/api/products");
// GET all resources automatically parsed into List<T>
auto products = client.GetAll();
// POST new resource automatically serialized to JSON
ProductItem newProduct{"Milk Frother", 35};
DotNetDupe::System::String reply = client.Post(newProduct);
}
3. Using the Database Layer
DotNetDupe emulates C# ADO.NET (SqlConnection, SqlCommand, SqlDataReader) for SQL execution.
Recommended Usage Patterns
- Routing and Engine Fallback via Connection String:
- In-Memory Emulation (Default): Use
Engine=InMemory;for unit testing or when you don't want server/file dependencies. This runs an in-memory SQL parsing engine. - Persistent SQLite: Use
Engine=SQLite; Data Source=my_db.db;when you need actual SQLite file persistence. Note: Requires compilation with theDOTNETDUPE_USE_SQLITEflag defined.
- In-Memory Emulation (Default): Use
- Always Parameterize Queries: Use
AddWithValueparameters to protect queries against parsing issues and SQL syntax injections. - Use RAII and Smart Pointers: Wrap database commands and readers in smart pointers to guarantee resource cleanup.
#include "System/Data/SqlClient/SqlConnection.h"
#include "System/Data/SqlClient/SqlCommand.h"
#include "System/Console.h"
void AccessDatabase() {
using namespace DotNetDupe::System;
using namespace DotNetDupe::System::Data::SqlClient;
try {
// Connect. Uses default In-Memory emulation engine if SQLite is not compiled.
SqlConnection conn("Data Source=InventoryDb;Engine=InMemory;");
conn.Open();
// 1. Create table schema
auto cmdCreate = conn.CreateCommand();
cmdCreate->SetCommandText("CREATE TABLE Items (Id INT, Name VARCHAR, Price INT)");
cmdCreate->ExecuteNonQuery();
// 2. Parameterized Insert (Recommended)
auto cmdInsert = conn.CreateCommand();
cmdInsert->SetCommandText("INSERT INTO Items (Id, Name, Price) VALUES (@id, @name, @price)");
cmdInsert->GetParameters()->AddWithValue("@id", 101);
cmdInsert->GetParameters()->AddWithValue("@name", "Bean Grinder");
cmdInsert->GetParameters()->AddWithValue("@price", 75);
cmdInsert->ExecuteNonQuery();
// 3. Querying rows
auto cmdSelect = conn.CreateCommand();
cmdSelect->SetCommandText("SELECT Id, Name, Price FROM Items WHERE Price < @maxPrice");
cmdSelect->GetParameters()->AddWithValue("@maxPrice", 100);
auto reader = cmdSelect->ExecuteReader();
while (reader->Read()) {
int id = reader->GetInt32(0);
String name = reader->GetString(1);
int price = reader->GetInt32(2);
Console::Write("Item: ");
Console::Write(name);
Console::Write(" costs $");
Console::WriteLine(price);
}
conn.Close();
} catch (const Exception& ex) {
Console::Write("Database Error: ");
Console::WriteLine(ex.What());
}
}
STL vs DotNetDupe Comparison βοΈ
DotNetDupe is designed to be more intuitive and less verbose than the standard C++ STL. Architectural comparisons, usage patterns, and class-by-class overviews are available in the Interactive Documentation Portal.
Sample Client and Test Code π§ͺ
The repository includes DotNetDupeDemo (a sample console application) and DotNetDupeTests (unit tests) projects. These projects demonstrate how to integrate and use the DotNetDupe library. You can refer to their .vcxproj files for examples of how to configure your own projects to consume the DotNetDupe NuGet package.
API Reference π
DotNetDupe provides comprehensive documentation through an interactive portal:
- π Interactive Documentation Portal: Modern web interface with real-time class search, namespace categorization, section-wise API browsing, and C# vs C++ code comparisons.
Generating API Documentation Locally: You can rebuild the entire documentation suite locally at any time using PowerShell:
powershell -ExecutionPolicy Bypass -File .\scripts\Generate-Docs.ps1 -OpenBrowser
For detailed information on the available classes, methods, and their usage, please refer to the comprehensive API documentation for each class:
Navigation: Click any Class Name to inspect its C++ header interface, or click π to open its generated Doxygen API reference.
Namespace: DotNetDupe::System π
Core Primitives & Base Classes
| Class | Description |
|---|---|
| Object π | Supports all classes in the .NET class hierarchy and provides low-level services to derived classes. |
| SmartPointer<T> π | Unified smart pointer supporting RAII unique and shared reference-counted ownership. |
| EventArgs π | Base class for event data payloads with Empty singleton representation. |
| EventHandler<TEventArgs> π | Multicast delegate supporting publisher-subscriber event model with token unsubscription. |
| Char π | Represents character code points and provides Unicode classification and transformation methods. |
| String π | Represents immutable sequences of UTF-8 and UTF-16 characters (String and WString). |
| Array<T> π | Provides methods for creating, manipulating, searching, and sorting arrays. |
| BitConverter π | Converts base data types to arrays of bytes, and arrays of bytes to base data types. |
| Buffer π | Manipulates arrays of primitive types efficiently. |
| Console π | Reads and writes to standard I/O streams with full color control and stream redirection. |
| Convert π | Converts base data types and hexadecimal strings. |
| DateTime π | Represents an instant in time, typically expressed as a date and time of day. |
| DateTimeOffset π | Represents a point in time relative to UTC with time zone offset. |
| TimeSpan π | Represents a time interval. |
| TimeZone π | Represents a time zone. |
| TimeZoneInfo π | Represents any time zone in the world with Daylight Saving adjustments. |
| DaylightTime π | Defines the period of daylight saving time. |
| TimeProvider π | Provides a testable abstraction for date and time. |
| Guid π | Represents a globally unique identifier (GUID). |
| Environment π | Provides environment variables, machine info, and platform properties. |
| OperatingSystem π | Represents operating system platform identifiers and version metadata. |
| Random π | Represents a pseudo-random number generator. |
| Uri π | Provides an object representation of Uniform Resource Identifiers (URI). |
| UriBuilder π | Provides convenient mutation of URI components. |
| UriComponents π | Specifies parts of a URI. |
| UriFormat π | Controls how URI information is escaped. |
| UriParser π | Parses and validates URI schemes. |
| GenericUriParser π | Customizable parser for hierarchical URI schemes. |
| Version π | Represents version numbers (major.minor.build.revision). |
Core Interfaces
| Interface | Description |
|---|---|
| IDisposable π | Defines a mechanism for deterministic release of unmanaged resources. |
| IClonable π | Defines mechanisms for deep or shallow object cloning. |
| IComparable π | Defines comparison method for sorting and ordering. |
| IComparable<T> π | Defines strongly-typed comparison method for sorting and ordering. |
| IFormatProvider<T> π | Provides custom type-formatting services. |
| IServiceProvider π | Defines service object resolution mechanism for dependency injection. |
Exceptions
| Exception | Description |
|---|---|
| Exception π | Root exception class for all DotNetDupe library errors. |
| SystemException π | Base class for system-level runtime exceptions. |
| ArgumentException π | Thrown when an argument passed to a method is invalid. |
| ArgumentNullException π | Thrown when a null argument is passed to a non-null parameter. |
| ArgumentOutOfRangeException π | Thrown when an argument falls outside allowable boundary limits. |
| ArithmeticException π | Thrown for errors in mathematical or arithmetic operations. |
| FormatException π | Thrown when string or argument formatting is invalid. |
| NotImplementedException π | Thrown when a requested method or feature is not implemented. |
| OverflowException π | Thrown on arithmetic or conversion overflow. |
Namespace: DotNetDupe::System::Collections::Generic π
Classes
| Class | Description |
|---|---|
| List<T> π | Strongly-typed dynamic array list accessible by index. |
| Dictionary<TKey, TValue> π | Key/value hash map collection. |
| HashSet<T> π | Set of unique elements backed by a hash table. |
| Queue<T> π | First-In-First-Out (FIFO) queue collection. |
| Stack<T> π | Last-In-First-Out (LIFO) stack collection. |
| PriorityQueue<TElement, TPriority> π | Min-heap collection of prioritized items. |
| SortedDictionary<TKey, TValue> π | Key/value collection sorted by key. |
| SortedSet<T> π | Ordered unique collection maintained in sorted order. |
| LinkedList<T> π | Doubly-linked list collection. |
| Generic Collections Overview π | Comprehensive guide and comparison of generic collection types. |
Namespace: DotNetDupe::System::Collections::Concurrent π
Classes
| Class | Description |
|---|---|
| ConcurrentDictionary<TKey, TValue> π | Thread-safe key/value collection for concurrent multi-threaded access. |
| ConcurrentQueue<T> π | Lock-free thread-safe First-In-First-Out (FIFO) queue. |
| ConcurrentStack<T> π | Lock-free thread-safe Last-In-First-Out (LIFO) stack. |
| ConcurrentBag<T> π | Thread-safe unordered object container with thread-local storage. |
| BlockingCollection<T> π | Thread-safe collection providing blocking producer-consumer capabilities. |
| Concurrent Collections Overview π | Comprehensive guide and architecture of lock-free and thread-safe collections. |
Namespace: DotNetDupe::System::IO π
Classes
| Class | Description |
|---|---|
| File π | Static helper methods for file creation, reading, writing, moving, and deletion. |
| Directory π | Static helper methods for creating (including recursive creation), moving, deleting, and enumerating directories. |
| Path π | Performs cross-platform directory and file path string operations. |
| Stream π | Abstract base class for byte sequence streams. |
| FileStream π | Provides a byte stream for files supporting synchronous read/write. |
| MemoryStream π | Creates a stream whose backing store is memory. |
| TextReader π | Abstract reader for sequential character input. |
| TextWriter π | Abstract writer for sequential character output. |
| StringReader π | Implements TextReader reading from a String. |
| StringWriter π | Implements TextWriter writing characters into a string buffer. |
| BinaryReader π | Reads primitive data types as binary values in Little-Endian or Big-Endian encoding from a stream. |
| BinaryWriter π | Writes primitive data types in binary format with configurable endianness to a stream. |
Exceptions
| Exception | Description |
|---|---|
| IOException π | Thrown when an I/O or file system error occurs. |
| FileNotFoundException π | Thrown when an attempt to access a file that does not exist on disk fails. |
| DirectoryNotFoundException π | Thrown when part of a file or directory path cannot be found. |
| EndOfStreamException π | Thrown when reading is attempted past the end of a stream. |
Namespace: DotNetDupe::System::Threading & System::Threading::Tasks π
Classes
| Class | Description |
|---|---|
| Thread π | Creates, configures, and controls OS threads. |
| ThreadPool π | High-throughput worker thread pool managing parallel task execution. |
| Task π | Represents asynchronous operations with continuation support. |
| Task<T> π | Represents asynchronous operations returning a result value. |
| WaitHandle π | Abstract base class for thread synchronization handles. |
| EventWaitHandle π | Manages cross-thread and system synchronization event signals. |
| AutoResetEvent π | Notifies waiting threads and automatically resets to non-signaled state. |
| ManualResetEvent π | Notifies waiting threads and remains signaled until manually reset. |
| Mutex π | Mutual exclusion synchronization primitive (supports named inter-process mutexes). |
| Semaphore π | Limits concurrent thread access to a bounded resource pool. |
| SemaphoreSlim π | Lightweight alternative to Semaphore avoiding kernel transitions for fast locking. |
| CriticalSection π | Low-overhead recursive mutex primitive for intra-process synchronization. |
| Interlocked π | Provides atomic hardware operations (Increment, Decrement, Exchange, CompareExchange). |
| Lock<T> π | Exception-safe RAII lock wrapper for synchronization primitives. |
Exceptions
| Exception | Description |
|---|---|
| ThreadStateException π | Thrown when a thread is in an invalid state for the requested operation. |
| ThreadInterruptedException π | Thrown when a thread is interrupted while waiting. |
| SynchronizationLockException π | Thrown when unlocking a synchronization object not owned by the caller. |
| AbandonedMutexException π | Thrown when a thread acquires a mutex abandoned by another terminating thread. |
| WaitHandleCannotBeOpenedException π | Thrown when attempting to open a non-existent named system sync handle. |
| SemaphoreFullException π | Thrown when releasing a semaphore whose count is already at maximum capacity. |
| TaskCanceledException π | Thrown when a task execution is canceled. |
Namespace: DotNetDupe::System::Diagnostics π
Classes
| Class | Description |
|---|---|
| Process π | Starts, manages, monitors, and redirects stdin/stdout/stderr for child processes. |
| Stopwatch π | High-resolution performance timer for measuring elapsed time. |
| EventLog π | Interacts with OS diagnostic event logs and writes operational entries. |
| EtwLogReader π | Queries Event Tracing for Windows (ETW) channels and Linux syslog files with live event subscription listening. |
| SystemMetrics π | Queries system hardware telemetry metrics including CPU %, Memory load, Disk %, Network Mbps, and top processes. |
| RealtimeTelemetry π | High-frequency telemetry metrics streaming and real-time dashboard endpoint. |
| ActiveUserSession π | Enumerates active and terminal user sessions across the system. |
| TerminalSession π | Enumerates active, disconnected, and remote desktop (RDP) Terminal Services sessions. |
| ProcessStreamer π | Progressive, non-blocking two-tier telemetry streaming and event-driven observable process enumerator. |
Namespace: DotNetDupe::System::Net, Sockets & Security π
Classes
| Class | Description |
|---|---|
| Dns π | Provides domain name resolution and IP address lookup. |
| Socket π | Low-level cross-platform BSD/WinSock socket abstraction. |
| NetworkStream π | Implements Stream backed by a network socket. |
| TcpClient π | Client connection wrapper for TCP network services. |
| TcpListener π | TCP listener for accepting incoming network connections. |
| UdpClient π | User Datagram Protocol (UDP) client for datagram transmission. |
| SslStream π | TLS/SSL secure stream wrapper built on OpenSSL. |
Namespace: DotNetDupe::System::Net::Http π
Classes
| Class | Description |
|---|---|
| HttpClient π | Sends HTTP/HTTPS requests and receives responses from URI endpoints. |
| RestClient<T> π | Strongly-typed REST client with automated C++ structure JSON serialization/deserialization. |
| FileDownloader π | High-level HTTP/HTTPS file downloader with pause/resume, speed metrics, and prompt resource disposal. |
| HttpRequestMessage π | Represents an outgoing HTTP request with headers, method, and payload. |
| HttpResponseMessage π | Represents an HTTP response with status code, response headers, and content stream. |
| HttpContent π | Base class for HTTP entity bodies and content headers. |
| StringContent π | HTTP content wrapper for text and JSON payloads. |
| ByteArrayContent π | HTTP content wrapper for raw byte arrays and binary payloads. |
| HttpMethod π | Represents standard HTTP request methods (GET, POST, PUT, DELETE, etc.). |
Namespace: DotNetDupe::System::Text & System::Text::Json π
Classes
| Class | Description |
|---|---|
| StringBuilder π | Mutable string buffer for high-performance string concatenation. |
| TextEncoding π | Represents character encodings (UTF-8, ASCII, UTF-16). |
| JsonSerializer π | Serializes objects to JSON strings and deserializes JSON to C++ types. |
Namespace: DotNetDupe::System::Utils π
Classes
| Class | Description |
|---|---|
| StringConvert π | Static helper methods for UTF-8 / UTF-16 conversions and type transformations. |
Namespace: DotNetDupe::System::Security π
Classes
| Class | Description |
|---|---|
| UserPrincipal π | Cross-platform user account enumeration, group memberships, and administrative privilege inspection. |
| HMACSHA256 π | Computes SHA256 Hash-based Message Authentication Codes. |
| X509Certificate2 π | Loads and inspects X.509 SSL/TLS certificates and private keys. |
| JWTToken π | Encodes, parses, and validates JSON Web Tokens with HMAC-SHA256 signature verification. |
Namespace: DotNetDupe::System::Data::SqlClient π
Classes
| Class | Description |
|---|---|
| SqlConnection π | Represents an open connection to a database (supports In-Memory emulation and SQLite persistence). |
| SqlCommand π | Represents SQL statements and queries to execute against a database. |
| SqlDataReader π | Forward-only cursor for reading result rows from SQL queries. |
| SqlParameter π | Parameter for parameterized SQL commands protecting against SQL injection. |
Namespace: DotNetDupe::Extensions::DependencyInjection π
Classes & Interfaces
| Type | Description |
|---|---|
| ServiceCollection π | Accumulates service descriptors with Transient, Scoped, and Singleton lifetimes. |
| ServiceProvider π | Dependency injection container resolving registered service dependencies. |
| ServiceScope π | Represents a lifetime scope for resolving scoped service instances. |
| ServiceScopeFactory π | Factory for creating scoped service containers. |
| IServiceCollection π | Contract for service collection builders. |
| IServiceScope π | Contract for lifetime scopes. |
| IServiceScopeFactory π | Contract for service scope factories. |
Namespace: DotNetDupe::Extensions::Logging π
Classes & Interfaces
| Type | Description |
|---|---|
| LogManager π | Global thread-safe static factory and cache for category loggers and file/console providers. |
| LoggerTextWriter π | High-performance stream redirector bridging TextWriter output into LogManager. |
| LoggerFactory π | Configures providers and generates category loggers. |
| Logger<T> π | Generic category logger for class-specific logging. |
| ConsoleLoggerProvider π | Renders structured console log records (Plain text and JSON format). |
| FileLoggerProvider π | Thread-safe file logging provider with auto directory creation and relative path resolution. |
| ILogger π | Core interface for emitting structured diagnostic log events. |
| ILoggerOf<T> π | Generic category logger interface. |
| ILoggerProvider π | Provider factory interface for creating loggers. |
| ILoggerFactory π | Logging factory interface. |
Namespace: DotNetDupe::WebAppCore π
Builder, Controllers & Server
| Class | Description |
|---|---|
| WebApplicationBuilder π | Configures services, dependency injection, and builds the WebApplication host. |
| WebApplication π | Configures routing endpoints and executes the HTTP server listener. |
| WebAppServer π | Web server hosting static website content (index.html, CSS, JS) and REST APIs simultaneously. |
| ControllerBase π | Base class for ASP.NET MVC / Web API style controllers (Ok, Created, NotFound, BadRequest). |
| ControllerRouteBuilder<T> π | Maps controller actions and automates JSON payload serialization and deserialization. |
| HttpContext π | Encapsulates HTTP request and response context for individual HTTP transactions. |
| HttpRequest π | Represents incoming HTTP request headers, query parameters, and body. |
| HttpResponse π | Represents outgoing HTTP response status codes, headers, and body. |
| Push Notifications (SSE & WebSockets) π | Real-time push notifications via Server-Sent Events (SSE) and full-duplex WebSockets. |
Project Status π§
DotNetDupe is currently under active development. I am continuously working on expanding the API coverage and improving stability.
Contributions π
Contributions to the DotNetDupe project are highly welcome! Whether it's bug reports, feature requests, code contributions, or documentation improvements, your help is invaluable. Please refer to GitHub's general contributing guidelines for more information on how to get started.
CI/CD Pipeline π
This repository uses GitHub Actions to automate the build, test, and release process.
Workflow Details
- Build & Test Matrix: Every push to
mainand all pull requests trigger a full build (Debug & Release) across Windows (MSBuild) and Linux (CMake/GCC), running all 660 Google Tests. - GitHub CodeQL Analysis: Continuous semantic security vulnerability scanning on every push, pull request, and weekly schedule via
github/codeql-action. - Quality Gates & Static Analysis: Automated enforcement of 11 Quality Gate metrics (LLOC β€ 15, CCN β€ 10, Nesting depth β€ 4, Hungarian SmartPointers, zero empty catch blocks, zero standard
throw std::*exceptions, zero raw pointer ownership). - Code Coverage: Automated code coverage measurement via OpenCppCoverage (> 80% line coverage required) and static analysis HTML report generation.
- NuGet Release: Pushing a tag (e.g.,
v1.0.0) triggers the creation and publishing of the NuGet package to nuget.org.
Code Coverage & Static Analysis π
- Online Reports:
- Live Documentation Portal: https://sudheeshps.github.io/dotnetdupe/
- Local Generation: Run
powershell .\scripts\Generate-CoverageReport.ps1to execute tests under OpenCppCoverage and refresh theCodeCoverage/folder.
How to Release
- Update the version in
DotNetDupe.nuspec. - Commit and push the changes.
- Create and push a new tag:
Note: Requiresgit tag v1.0.0 git push origin v1.0.0NUGET_API_KEYto be set in GitHub repository secrets.
License π
This project is licensed under the MIT License. See the LICENSE file for details.
Generated Content π€
This project is a unique blend of manual craftsmanship and AI-powered development, built collaboratively by myself and my peer Antigravity. While the initial core components were meticulously crafted by hand, the remaining code, including many classes, methods, and their corresponding unit tests, were developed and expanded with Antigravity. This project stands as a testimonial on how persistent human effortβspanning weekends and late eveningsβcombined with generative AI can build an entire, robust system from scratch.
Contact π§
For questions or support, please open an issue on the GitHub repository or contact sudheeshps@gmail.com.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| native | native is compatible. |
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.0.7 | 98 | 9/10/2026 |
| 4.0.6 | 95 | 9/10/2026 |
| 4.0.5 | 92 | 9/9/2026 |
| 4.0.4 | 90 | 9/9/2026 |
| 4.0.3 | 147 | 8/20/2026 |
| 4.0.2 | 101 | 8/20/2026 |
| 4.0.1 | 110 | 8/17/2026 |
| 4.0.0 | 109 | 8/15/2026 |
| 3.0.6 | 108 | 8/6/2026 |
| 3.0.5 | 114 | 8/6/2026 |
| 3.0.4 | 105 | 8/5/2026 |
| 3.0.2 | 110 | 8/5/2026 |
| 3.0.1 | 127 | 6/20/2026 |
| 3.0.0 | 118 | 5/31/2026 |
| 2.1.0 | 122 | 5/21/2026 |
| 2.0.0 | 114 | 5/20/2026 |
| 1.0.0 | 211 | 5/9/2026 |
v4.0.7: Fixed documentation and report links on NuGet.org and GitHub Pages; published OpenCppCoverage and Static Analysis reports under docs/CodeCoverage. Previous: v4.0.6: Standardized documentation header across all API reference pages with real-time NuGet versioning; fixed GitHub Pages 404 Not Found error on header and source navigation links. Previous: v4.0.5: Fixed NuGet package documentation links (Interactive Documentation Portal and Doxygen API reference URLs). Previous: v4.0.4: Added System::IO::BinaryReader and BinaryWriter with configurable endianness and stream seeking; Added GetChars() to System::String; Documentation updates. Previous: v4.0.3: First-class C# .NET EventHandler<TEventArgs> and EventArgs delegate model; FileDownloader and ProcessStreamer modernization to multicast EventHandlers; Process::GetProcesses(), Process::GetProcessById(), and Process::GetProcessesByName() process discovery APIs; on-demand SystemMetrics::EnrichProcessInfo(); Version::Parse and Version::TryParse string parsing APIs.