-
Notifications
You must be signed in to change notification settings - Fork 99
Roadmap 4x
High-level overview of what is planned for future 4.x releases.
The initial 4.0.0-alpha delivered the items below — each is documented on its own page, so they are only listed here (see History for the full release notes):
- Change tracking — snapshot on load, diff-based save
- Safe Mode — take / release / unroll with rollback-on-disconnect
-
REST transport (
Rest/RestSsl, RouterOS 7.1+) -
Telnet and SSH CLI transports (SSH as the satellite
tik4net.sshpackage) - MAC-Telnet — Layer-2 CLI, no IP route needed
- WinBox CLI and WinBox CLI over MAC — encrypted terminal CLI
-
WinBox Native M2 and over MAC — structured CRUD, no terminal
⚠️ alpha-preview -
Raw command pass-through —
conn.CreateRawCommand(raw) -
WinBox Native addressing by GUI names — opt-in
UseGuiNames - Connection capability model —
Supports/Require, fail-closed - MCP server — run any command over any transport from an AI assistant
-
Package consolidation — the O/R mapper moved into the main
tik4netpackage;tik4net.objects/tik4net.entitiesare no longer published. See Upgrading from 3.x to 4.0.
A new high-level entry point that wraps the existing connection and entity layers behind a clean, async-first interface:
await using var link = await TikLink.ConnectAsync("192.168.1.1", "admin", "pwd");
var rules = await link.Ip.Firewall.Filter
.Where(r => r.Chain == "input")
.ToListAsync();
var rule = await link.Ip.Firewall.Filter.GetAsync("*1");
rule.Comment = "WAN";
await link.SaveAsync(rule); // uses change trackingAll operations are async/await. The existing synchronous ITikConnection API remains fully supported.
The TikLink object exposes a typed tree that mirrors the MikroTik CLI hierarchy — link.Ip.Firewall.Filter, link.System.Identity, link.Interface, etc. — instead of requiring a generic Query<T>() call.
Note: The tree will initially be hand-written for the most common paths (~50). Automatic generation from
[TikEntity]attributes via a Roslyn source generator is planned as a follow-up step — we need to explore the complexity first.
First-class wrappers for non-CRUD commands with fluent builders:
await link.System.Reboot.ExecuteAsync();
await foreach (var ping in link.Tool.Ping
.Address("8.8.8.8").Count(5).ExecuteAsync(ct))
{
Console.WriteLine(ping.Time);
}Bulk sync of a local list against the router, including support for ordered entities (firewall rules, queue trees). Computes the minimal set of add / update / delete / move operations needed to bring the router to the desired state.
IServiceCollection extension for ASP.NET Core / generic host applications:
services.AddTikLink(opt => {
opt.Host = config["MikroTik:Host"];
opt.User = config["MikroTik:User"];
opt.Password = config["MikroTik:Password"];
});Scoped lifetime (DbContext-style). Connection pooling TBD.
Drop legacy targets (net35 / net40 / netcoreapp1.x are already gone as of 3.6). For 4.x we plan to target net6.0 / net8.0 + netstandard2.0 / netstandard2.1, and enable #nullable reference types across the codebase.
.NET Framework 4.8 remains fully supported via netstandard2.0 and will continue to be tested.
-
Supported-entities index — a generated wiki page listing all built-in
[TikEntity]classes with their API paths, so users can see coverage at a glance. - Refresh High-level API tools — re-verify the entity generator / wiki importer workflow (the MikroTik wiki the importer parses has moved to help.mikrotik.com) and finish the "advanced usage" section.
- Compile-checked wiki samples — extract the wiki's C# code blocks into a compile-only test project so samples cannot drift from the API again.
MikroTik increasingly uses property values that typed enums cannot represent: negations (!dynamic), comma-separated combinations, version-dependent strings. A TikValue wrapper struct could expose these naturally while staying implicit-convertible from string.
This would be a breaking change to the entity model. We will evaluate scope and migration cost before committing.
Maintainer checklist — things that cannot be automated and are easy to forget.
-
Deprecate the
tik4net.entitiespackage on nuget.org.⚠️ Manual, web UI only. There is no CLI command for this —dotnet nugetonly offersdelete / push / verify / trust / sign / why, so it cannot be scripted into the publish workflow.- Where: nuget.org → Manage package → Deprecation
- Reason: Legacy, alternate package:
tik4net - Do this after 4.0.0 stable ships, not during the alphas — the alternate-package pointer should resolve to a stable version.
- Background:
tik4net.entitieswas the mapper's package ID for the 4.0 alphas only. Since4.0.0-alpha2the mapper ships insidetik4net, so the ID is dead. No replacement package is published for it — a single alpha does not justify a permanent empty package on nuget.org. - The same applies to
tik4net.objectsif that ID is ever recovered (it is currently held by a third party, see Upgrading from 3.x to 4.0). That one does have real 3.x users, so a forwarding package is worth reconsidering there.
Running list of behavioural / API-surface changes on the 4.x line that need to be called out in the 4.0 release notes. Most are source-compatible for typical try/catch usage; the binary-compatibility notes matter only for plugins/assemblies compiled against 3.x.
-
TikSentenceExceptionnow derives fromTikConnectionException(wasSystem.Exception). CatchingTikConnectionExceptionnow also catches malformed-sentence errors — the documented "one root catches everything" contract. Source-compatible (a widening: existingcatch (TikSentenceException)/catch (Exception)still work); binary-breaking (base type changed). -
Exception serialization removed.
[Serializable], theISerializable/SerializationInfoconstructors andGetObjectDatawere dropped fromTikConnectionExceptionandTikConnectionCapabilityNotSupportedException(the plumbing was incomplete across leaf types, carried non-serializable members, andBinaryFormatteris obsolete on thenetstandard2.0/2.1targets). Code relying on binary/remoting serialization of tik4net exceptions must useToString()/ structured logging instead. -
WinBox Native error mapping changed. An unrecognized router-reported M2 error now surfaces as
TikCommandTrapExceptioninstead ofTikCommandUnexpectedResponseException, matching the API/CLI/REST generic-error fallback. Callers that special-casedTikCommandUnexpectedResponseExceptionfor WinBox-native router errors should catchTikCommandTrapException(or its baseTikCommandException) instead.
See Exception handling for the full tree and per-type semantics.
-
Savedefault mode changed toOnlyChanges—Savediffs against a local snapshot instead of performing aLoadByIdround-trip. Entities not loaded viaLoad*are sent in full. To restore 3.x behavior globally:TikDefaults.SaveMode = TikSaveMode.FullUpdate;See Change tracking.
- Legacy targets dropped; 4.x targets
net6.0/net8.0+netstandard2.0/netstandard2.1with#nullableenabled. .NET Framework 4.8 remains supported vianetstandard2.0. (See Platform targets cleanup above.)