EasyExtensions.Drawing 3.0.65

dotnet add package EasyExtensions.Drawing --version 3.0.65
                    
NuGet\Install-Package EasyExtensions.Drawing -Version 3.0.65
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EasyExtensions.Drawing" Version="3.0.65" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EasyExtensions.Drawing" Version="3.0.65" />
                    
Directory.Packages.props
<PackageReference Include="EasyExtensions.Drawing" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EasyExtensions.Drawing --version 3.0.65
                    
#r "nuget: EasyExtensions.Drawing, 3.0.65"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package EasyExtensions.Drawing@3.0.65
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EasyExtensions.Drawing&version=3.0.65
                    
Install as a Cake Addin
#tool nuget:?package=EasyExtensions.Drawing&version=3.0.65
                    
Install as a Cake Tool

License NuGet NuGet downloads FuGet Build CodeFactor GitHub repo size

EasyExtensions

EasyExtensions is a modular set of .NET packages for application code that tends to repeat across projects: core BCL extensions, ASP.NET Core helpers, PostgreSQL/EF Core setup, Quartz job registration, WebDAV clients, ImageSharp utilities, embedded fonts, streaming AES-GCM encryption, and a lightweight mediator.

The repository is intentionally split into small NuGet packages. Install only the package you need, keep your application dependencies narrow, and use the XML documentation in your IDE or FuGet when you need a full API reference.

Contents

Packages

Package Target Use when you need
EasyExtensions netstandard2.1 Core extensions and helpers for strings, hashes, streams, enums, dates, IP/networking, claims, random strings, queues, password hashing abstractions, Brotli HTTP helpers, and stream cipher abstractions.
EasyExtensions.AspNetCore net10.0 ASP.NET Core helpers for exception responses, health checks, CORS, request metadata, rate limiting helpers, console logging, controllers, form files, CPU usage, and PBKDF2 password hashing registration.
EasyExtensions.AspNetCore.Authorization net10.0 JWT authentication setup, token creation, claim building, development authorization bypass, and a base auth controller with login, refresh, logout, password, and Google login hooks.
EasyExtensions.AspNetCore.Sentry net10.0 Sentry ASP.NET Core integration with user capture.
EasyExtensions.AspNetCore.Stack net10.0 One-call application setup for controllers, logging, compression, Quartz, SignalR, CORS, health checks, optional PostgreSQL, optional authorization, and optional EasyVault secrets.
EasyExtensions.Clients net10.0 Cached IP lookup helpers backed by ipapi.co.
EasyExtensions.Crypto net10.0 Streaming AES-GCM encryption/decryption, per-chunk authentication, HKDF subkeys, secure random bytes, and hash helpers.
EasyExtensions.Drawing net10.0 ImageSharp helpers for JPEG conversion, drawing text, blurred backgrounds, automatic brightness adjustment, and font integration.
EasyExtensions.EntityFrameworkCore net10.0 Audited entities and DbContext base types, Gridify mapper registration, database health checks, and migration helpers.
EasyExtensions.EntityFrameworkCore.Npgsql net10.0 PostgreSQL DbContext registration, connection string construction from configuration, lazy loading options, and design-time factory registration.
EasyExtensions.Fonts netstandard2.1 Embedded fonts: Arial, Consola, FreeMonospaced, RetroGaming, and UbuntuMono.
EasyExtensions.Mediator netstandard2.1 A MediatR v12.5.0 based mediator package with request, notification, stream request, pipeline behavior, pre/post processor, and exception processor support.
EasyExtensions.Quartz netstandard2.1 Reflection-based Quartz job registration with JobTriggerAttribute, hosted service setup, and optional PostgreSQL persistent store.
EasyExtensions.WebDav netstandard2.1 WebDAV and Nextcloud file operations: folders, existence checks, uploads, listings, downloads, and deletes.
EasyExtensions.Windows netstandard2.1 Windows-specific helpers for shortcuts and moving files or directories to the recycle bin.

Installation

Install packages individually:

dotnet add package EasyExtensions
dotnet add package EasyExtensions.AspNetCore
dotnet add package EasyExtensions.Crypto
dotnet add package EasyExtensions.EntityFrameworkCore.Npgsql

For an opinionated ASP.NET Core setup, start with:

dotnet add package EasyExtensions.AspNetCore.Stack

Quick Examples

Core Helpers

using EasyExtensions.Extensions;
using EasyExtensions.Helpers;
using System.Net;

string digest = "hello".Sha512();
IPAddress network = IPAddress.Parse("192.168.10.25").GetNetwork(24);
string maskedEmail = StringHelpers.HideEmail("vadim@example.com");

ASP.NET Core

using EasyExtensions.AspNetCore.Extensions;

builder.Logging.AddSimpleConsoleLogging();

builder.Services
    .AddDefaultHealthChecks()
    .AddDefaultCorsWithOrigins("https://app.example.com")
    .AddExceptionHandler()
    .AddPbkdf2PasswordHashService();

JWT Authorization

using EasyExtensions.AspNetCore.Authorization.Extensions;

builder.Services.AddJwt(useCookies: true);
{
  "JwtSettings": {
    "Key": "0123456789abcdef0123456789abcdef",
    "Issuer": "my-api",
    "Audience": "my-clients",
    "LifetimeMinutes": 60
  }
}

EasyStack

using EasyExtensions.AspNetCore.Stack.Extensions;

builder.AddEasyStack(stack => stack
    .WithPostgres<AppDbContext>(useLazyLoadingProxies: false)
    .AddAuthorization()
    .UseSecrets(useSecrets: true));

PostgreSQL and EF Core

using EasyExtensions.EntityFrameworkCore.Npgsql.Extensions;

builder.Services.AddPostgresDbContext<AppDbContext>(postgres =>
{
    postgres.ConfigurationSection = "DatabaseSettings";
    postgres.UseLazyLoadingProxies = false;
});
{
  "DatabaseSettings": {
    "Host": "localhost",
    "Port": "5432",
    "Username": "postgres",
    "Password": "postgres",
    "Database": "app"
  }
}

Quartz Jobs

using EasyExtensions.Quartz.Attributes;
using EasyExtensions.Quartz.Extensions;
using Quartz;

[JobTrigger(minutes: 5, startNow: true)]
public sealed class CleanupJob : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        return Task.CompletedTask;
    }
}

builder.Services.AddQuartzJobs();

Streaming Encryption

using EasyExtensions.Crypto;
using System.Security.Cryptography;

byte[] masterKey = RandomNumberGenerator.GetBytes(AesGcmStreamCipher.KeySize);
using var cipher = new AesGcmStreamCipher(masterKey, memoryLimitBytes: 256L * 1024 * 1024);

await using var input = File.OpenRead("plain.bin");
await using var encrypted = File.Create("plain.bin.eegcm");
await cipher.EncryptAsync(input, encrypted);

await using var cipherText = File.OpenRead("plain.bin.eegcm");
await using var plainText = File.Create("plain-restored.bin");
await cipher.DecryptAsync(cipherText, plainText);

WebDAV and Nextcloud

using EasyExtensions.WebDav;

using var client = WebDavCloudClient.CreateNextcloudClient(
    "https://cloud.example.com",
    username: "user",
    password: "app-password");

await client.CreateFolderAsync("backups");
using var backup = File.OpenRead("backup.zip");
await client.UploadFileAsync(backup, "backups/backup.zip");

Configuration Notes

  • The full solution currently uses the .NET 10 SDK. Some packages still target netstandard2.1; see the package table before choosing a package for older applications.
  • EasyExtensions.AspNetCore.Authorization accepts either a JwtSettings section or flat JwtKey, JwtIssuer, JwtAudience, and JwtLifetimeMinutes keys. Configure a persistent signing key in production.
  • EasyExtensions.AspNetCore.Stack allows all CORS origins when CorsOrigins is missing. Set CorsOrigins explicitly for production services.
  • EasyExtensions.AspNetCore.Sentry enables SendDefaultPii when Sentry is active. Review this against your data handling policy.
  • EasyExtensions.Crypto expects you to own key storage and rotation. Do not hard-code master keys in source control.
  • EasyExtensions.WebDav currently changes ServicePointManager.ServerCertificateValidationCallback; review this before production use.

Build and Test

git clone https://github.com/bvdcode/EasyExtensions.git
cd EasyExtensions/Sources
dotnet restore
dotnet build --configuration Release
dotnet test --configuration Release

The test projects use NUnit and target net10.0.

Releases

Releases are produced by GitHub Actions from main when files under Sources/ change. The workflow builds the solution, packs NuGet packages, publishes artifacts, pushes packages to GitHub Packages and NuGet.org, and creates a GitHub release. Versioning is driven by GitVersion; the current next-version is configured in GitVersion.yml.

Contributing

Contributions are welcome. For a clean pull request:

  1. Fork the repository.
  2. Create a focused feature branch.
  3. Add or update tests for behavior changes.
  4. Run dotnet test from Sources/.
  5. Update this README when package scope, setup, or public examples change.
  6. Open a pull request with a clear description of the change.

Issues and feature requests are also welcome. Small, well-scoped proposals are easiest to review.

License

Most packages are distributed under the MIT License. See LICENSE.md.

EasyExtensions.Mediator is based on MediatR v12.5.0 and uses Apache-2.0 package licensing. See Sources/EasyExtensions.Mediator/LICENSE.md.

Contact

Created and maintained by Vadim Belov.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
3.0.65 0 5/18/2026
3.0.64 0 5/18/2026
3.0.63 105 4/27/2026
3.0.62 109 4/24/2026
3.0.61 96 4/23/2026
3.0.60 92 4/22/2026
3.0.59 106 4/22/2026
3.0.58 92 4/22/2026
3.0.57 88 4/22/2026
3.0.56 102 4/14/2026
3.0.55 108 3/31/2026
3.0.54 100 3/20/2026
3.0.53 106 3/14/2026
3.0.52 112 3/10/2026
3.0.51 103 3/3/2026
3.0.50 101 3/1/2026
3.0.49 109 2/25/2026
3.0.48 114 2/25/2026
3.0.47 104 2/24/2026
3.0.46 105 2/24/2026
Loading failed