Getting Started

Quick Start & Installation

The EskimoControls Suite is distributed both as a standalone graphical installer (`EskimoControls.Installer.exe`) and as standard NuGet packages targeting .NET 8.0-windows and .NET 9.0-windows.

Installation via NuGet CLI

Run the following command in the Package Manager Console or your system terminal:

# Install the unified metapackage bundling all 69+ controls dotnet add package EskimoControls.All --version 12.85.46.1

Installation via Package Manager (Visual Studio)

  1. In Visual Studio, right-click on your project in the Solution Explorer and select Manage NuGet Packages.
  2. In the Package source dropdown, select EskimoControls-Local (or nuget.org).
  3. Search for EskimoControls.All and click Install.
Visual Studio Support

Visual Studio Toolbox Configuration

Modern .NET WinForms uses an Out-of-Process Designer architecture (DesignToolsServer). EskimoControls packages include an embedded tools/VisualStudioToolsManifest.xml that instructs Visual Studio 2022 and Visual Studio 2026 to automatically populate the Toolbox with drag-and-drop controls.

Each control is decorated with:

[ToolboxItem(true)] [DesignTimeVisible(true)] [Description("EskimoControl Virtual DataGrid with 1M+ rows capability")] public class EskimoControl_VirtualDataGrid : DataGrid, IEskimoControl { // WinForms Out-of-Process Designer ready }

When you open any WinForms Form or UserControl in the Visual Studio Designer, expand the EskimoControls tab in the Toolbox to drag and drop controls directly onto your design surface.

Maintenance

Setup Wizard, Reinstallation & Repair Mode

The dedicated WPF installer (`installer/DotNetControls.Installer/`) provides an enterprise-grade setup experience:

  • Selective Component Installation: Choose individual controls (e.g. only SCADA, only DICOM, only Math Plotter) or install the complete unified suite.
  • Automatic Installation Detection: When launched, the installer inspects the target folder for existing packages.
  • Reinstall Clean Mode: Completely removes outdated or corrupted package versions and extracts fresh binaries.
  • Repair & Fix Errors Mode: Verifies assembly integrity, clears the local NuGet cache (`dotnet nuget locals all --clear`), re-registers the NuGet feed source, and reinstates the `VisualStudioToolsManifest.xml` manifest.
Security

License Key Validation & Watermark Enforcement

The package license must be valid to use controls in production. When initialized without a valid license, controls operate in evaluation mode with an unmistakable watermark and informative notice.

Activation Method 1: In Code via RegisterLicense

Call DotNetControlsLicense.RegisterLicense in your application startup (e.g., Program.cs):

using DotNetControls.Core.Licensing; internal static class Program { [STAThread] static void Main() { // Register valid commercial serial number DotNetControlsLicense.RegisterLicense("DNC-ENT-2026-E966-F4FE-EC01"); ApplicationConfiguration.Initialize(); Application.Run(new MainForm()); } }

Activation Method 2: Offline license.lic File

Place the digitally signed license.lic file in your application root directory or output folder (`bin/Release/net9.0-windows/`):

// The suite automatically detects and parses 'license.lic' on first control load DotNetControlsLicense.RegisterLicenseFromFile("license.lic");

Invalid License Notice & Watermark Behavior

If no valid license key is provided or if the key fails checksum verification:

  • The control displays an alert notice detailing the invalid license state.
  • An unmistakable, semi-transparent diagonal trial watermark ("ESKIMO CONTROLS - INVALID LICENSE / UNLICENSED TRIAL") and corner ribbon banner are rendered over the control surface.
  • Controls cannot be used without this watermark until a valid license key is registered.
Web Integration

ASP.NET Core & Blazor Code Samples

EskimoControls provides seamless interoperability between desktop WinForms and web applications. You can reuse the exact same core models, licensing logic, math engines, and ERP connectors across your ASP.NET Core APIs and Blazor web applications.

1. Blazor Server / WebAssembly: Virtual DataGrid Component

Use EskimoControls virtualized data structures to feed high-performance Blazor grids:

@* VirtualDataGrid.razor - High Performance Blazor Server Component *@ @using DotNetControls.Core.Licensing @inject HttpClient Http <div class="eskimo-web-grid"> <div class="grid-toolbar"> <input @bind="searchTerm" @bind:event="oninput" placeholder="Instant Filter..." /> <span class="badge">Rows: @FilteredCount</span> </div> <table class="table"> <thead> <tr> <th>Transaction ID</th> <th>Enterprise Client</th> <th>Amount (GBP)</th> <th>Audit Status</th> </tr> </thead> <tbody> @foreach (var row in VisibleRows) { <tr> <td>@row.Id</td> <td>@row.CustomerName</td> <td>@row.FormattedAmount</td> <td><span class="status-pill">@row.Status</span></td> </tr> } </tbody> </table> </div> @code { private string searchTerm = ""; private List<TransactionModel> allRows = new(); protected override async Task OnInitializedAsync() { // Validate module license server-side DotNetControlsLicense.AssertModule("Grid"); allRows = await Http.GetFromJsonAsync<List<TransactionModel>>("/api/transactions") ?? new(); } private IEnumerable<TransactionModel> VisibleRows => string.IsNullOrWhiteSpace(searchTerm) ? allRows : allRows.Where(r => r.CustomerName.Contains(searchTerm, StringComparison.OrdinalIgnoreCase)); private int FilteredCount => VisibleRows.Count(); }

2. ASP.NET Core Minimal API & SignalR: Real-Time SCADA Telemetry Stream

Expose industrial process mimic data directly to web dashboards via SignalR:

// Program.cs - ASP.NET Core Minimal API + SignalR using Microsoft.AspNetCore.SignalR; using DotNetControls.Core.Licensing; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR(); builder.Services.AddHostedService<ScadaTelemetryWorker>(); var app = builder.Build(); // Activate License DotNetControlsLicense.RegisterLicense(builder.Configuration["EskimoControls:LicenseKey"] ?? "DNC-ENT-2026-E966-F4FE-EC01"); // SCADA Hub for live industrial telemetry app.MapHub<ScadaProcessHub>("/hubs/scada"); // REST endpoint to trigger emergency stop app.MapPost("/api/scada/estop", async (IHubContext<ScadaProcessHub> hub) => { await hub.Clients.All.SendAsync("EmergencyStopTripped", new { TrippedBy = "Web Operator", Time = DateTime.UtcNow }); return Results.Ok(new { Status = "E-Stop Active" }); }); app.Run(); public class ScadaProcessHub : Hub { }

3. ASP.NET Core MVC: DICOM 16-Bit Medical Slice Streaming

Serve calibrated Hounsfield DICOM slices to web browsers and desktop endpoints:

// Controllers/DicomController.cs - ASP.NET Core Controller using Microsoft.AspNetCore.Mvc; using DotNetControls.Engineering; [ApiController] [Route("api/[controller]")] public class DicomController : ControllerBase { [HttpGet("studies/{studyId}/slice/{sliceIndex}")] public IActionResult GetCalibratedSlice(string studyId, int sliceIndex, [FromQuery] int windowWidth = 350, [FromQuery] int windowCenter = 40) { // 1. Fetch raw 16-bit CT slice matrix short[,] rawMatrix = LoadDicomMatrix(studyId, sliceIndex); // 2. Generate 8-bit windowed grayscale image byte[] pngBytes = RenderDicomToPng(rawMatrix, windowWidth, windowCenter); return File(pngBytes, "image/png"); } }

4. Blazor Component: Step-by-Step Math Formula Solver

Invoke the StepMathSolver engine in Blazor web apps to display mathematical derivations:

@* FormulaSolver.razor - Pedagogical Equation Solver *@ @using DotNetControls.Visualization <div class="math-solver-card"> <input @bind="formulaInput" placeholder="Enter equation (e.g. 2*x^2 - 4*x - 6 = 0)" /> <button @onclick="SolveEquation" class="btn btn-primary">Solve Step-by-Step</button> @if (result != null) { <div class="solution-banner"> <h4>Answer: @result.FinalAnswer</h4> </div> @foreach (var step in result.Steps) { <div class="step-item"> <strong>Step @step.StepNumber: @step.Title</strong> <p>@step.Description</p> <code>@step.Formula</code> </div> } } </div> @code { private string formulaInput = "2*x^2 - 4*x - 6 = 0"; private SolverResult? result; private void SolveEquation() { result = StepMathSolver.SolveEquation(formulaInput); } }

5. ASP.NET Core HostedService: Multi-ERP Sync Engine (Xero / QuickBooks / Sage)

Run automated background synchronization with financial ERP platforms:

using Microsoft.Extensions.Hosting; using DotNetControls.Accounting; public class ErpSyncWorker : BackgroundService { private readonly ILogger<ErpSyncWorker> _logger; public ErpSyncWorker(ILogger<ErpSyncWorker> logger) => _logger = logger; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Synchronizing invoices with Xero & QuickBooks..."); // 1. Initialize ERP Connectors var xero = new XeroAccountingControl(); await xero.SyncWithXeroAsync(); var qb = new QuickBooksAccountingControl(); await qb.SyncWithQuickBooksAsync(); // Run every 15 minutes await Task.Delay(TimeSpan.FromMinutes(15), stoppingToken); } } }