WiseProgress.Data
2026.5.21.1
Prefix Reserved
dotnet add package WiseProgress.Data --version 2026.5.21.1
NuGet\Install-Package WiseProgress.Data -Version 2026.5.21.1
<PackageReference Include="WiseProgress.Data" Version="2026.5.21.1" />
<PackageVersion Include="WiseProgress.Data" Version="2026.5.21.1" />
<PackageReference Include="WiseProgress.Data" />
paket add WiseProgress.Data --version 2026.5.21.1
#r "nuget: WiseProgress.Data, 2026.5.21.1"
#:package WiseProgress.Data@2026.5.21.1
#addin nuget:?package=WiseProgress.Data&version=2026.5.21.1
#tool nuget:?package=WiseProgress.Data&version=2026.5.21.1
WiseProgress.Data
A data access library targeting .NET Standard 2.0 (compatible with .NET Framework 4.8 and .NET 8).
Namespace root: WiseProgress.Data
SQL provider: Microsoft.Data.SqlClient
Table of Contents
- ConnectionInfo
- SqlConnection
- QueryBuilder(Of T)
- CommandBuilder
- CommandBuilderList
- SqlManagement.Server
- DatabaseComparer
ConnectionInfo
Namespace: WiseProgress.Data.SqlConnection
Implements: IDisposable
Holds the connection parameters used to build a SQL Server connection string.
Properties
| Property | Type | Default | Description |
|---|---|---|---|
ServerName |
String |
— | SQL Server host name or IP |
Database |
String |
— | Initial database / catalog |
SqlUser |
String |
— | SQL Server login username |
SqlPassword |
String |
— | SQL Server login password |
WindowsAuthentication |
Boolean |
False |
Use Windows (Integrated) authentication instead of SQL login |
UseConnectedEnvironment |
Boolean |
False |
When True, the connection stays open between calls (required for transactions) |
ConnectTimeout |
Integer |
15 |
Seconds to wait when opening the connection |
CommandTimeout |
Integer |
60 |
Seconds to wait for a command to execute |
TrustServerCertificate |
Boolean |
True |
Bypasses SSL certificate validation |
Constructors
New()
New(ServerName, Database, SqlUser, SqlPassword, WindowsAuthentication)
Example
Dim info As New ConnectionInfo(".", "MyDB", "sa", "pass", False)
info.UseConnectedEnvironment = True ' keep connection open (needed for transactions)
SqlConnection
Namespace: WiseProgress.Data.SqlConnection
Implements: IDisposable
The main database access class. Wraps Microsoft.Data.SqlClient.SqlConnection and exposes synchronous and asynchronous query, scalar, reader, and transaction methods.
Properties
| Property | Type | Description |
|---|---|---|
ConnectionInfo |
ConnectionInfo |
Connection parameters |
ConnectionString |
String (ReadOnly) |
Built connection string derived from ConnectionInfo |
ConnectionOpened |
Boolean (ReadOnly) |
True if the underlying connection is currently open |
MainSqlConnection |
SqlConnection (ReadOnly) |
The raw Microsoft.Data.SqlClient.SqlConnection. Opens if not already open |
CurrenctSqlTransaction |
SqlTransaction |
The active transaction, if any |
Constructors
New()
New(ServerName, Database, SqlUser, SqlPassword, WindowsAuthentication)
Connection Methods
| Method | Signature | Description |
|---|---|---|
ConnectToServer |
() As Boolean |
Opens the connection if not already open |
ConnectToServerAsync |
() As Task(Of Boolean) |
Async version of ConnectToServer |
Close |
() |
Closes the connection |
SwitchToDatabase |
(DatabaseName As String) |
Changes the active database (USE DatabaseName) |
Transaction Methods
Requires
ConnectionInfo.UseConnectedEnvironment = True
| Method | Signature | Description |
|---|---|---|
BeginTrans |
() As SqlTransaction |
Starts a new transaction. Throws if one is already active |
CommitTrans |
() As Boolean |
Commits and disposes the active transaction |
CommitTrans |
(Transaction As SqlTransaction) As Boolean |
Commits and disposes a specific transaction |
RollBack |
() |
Rolls back and disposes the active transaction |
RollBack |
(Transaction As SqlTransaction) |
Rolls back and disposes a specific transaction |
Execute Methods
| Method | Signature | Returns | Description |
|---|---|---|---|
ExecuteNonQuery |
(Query As String) |
Integer |
Runs a non-SELECT statement. Returns rows affected |
ExecuteNonQueryAsync |
(Query As String) |
Task(Of Integer) |
Async version |
ExecuteQuery |
(Query As String) |
DataTable |
Runs a SELECT and returns a DataTable |
ExecuteQueryAsync |
(Query As String) |
Task(Of DataTable) |
Async version |
ExecuteQuery(Of T) |
(Query As String) |
List(Of T) |
Runs a SELECT and maps rows to a typed list by column name ↔ property name |
ExecuteQuery(Of T) |
(tableOrView, whereCondition, orderBy) |
List(Of T) |
Builds and runs a SELECT * query with optional WHERE / ORDER BY |
ExecuteQueryAsync(Of T) |
(Query As String) |
Task(Of List(Of T)) |
Async typed query |
ExecuteQueryBinding(Of T) |
(Query As String) |
BindingList(Of T) |
Returns a BindingList for data binding scenarios |
ExecuteQueryOneRow |
(Query As String) |
DataRow |
Returns the first row or Nothing |
ExecuteQueryOneRowAsync |
(Query As String) |
Task(Of DataRow) |
Async version |
ExecuteQueryOneRow(Of T) |
(Query As String) |
T |
Returns the first row mapped to T, or a new empty T |
ExecuteQueryOneRowAsync(Of T) |
(Query As String) |
Task(Of T) |
Async version |
ExecuteQueryOneRow(Of T) |
(query, ByRef item As T) |
— | Sets item to the first matching row |
ExecuteSelectQuery |
(tableOrView, whereCondition, orderBy) |
DataTable |
Builds SELECT * FROM table [WHERE] [ORDER BY] and returns a DataTable |
ExecuteSelectQuery(Of T) |
(whereCondition, orderBy) |
DataTable |
Same but derives table name from GetType(T).Name |
ExecuteScalar |
(Query As String) |
Object |
Returns the first column of the first row |
ExecuteReader |
(Query As String) |
SqlDataReader |
Returns an open SqlDataReader (uses CommandBehavior.CloseConnection) |
Scalar / Utility Methods
| Method | Signature | Returns | Description |
|---|---|---|---|
GetValue |
(Query As String) |
Double |
Returns the first cell as Double, or 0 if no rows |
GetStringValue |
(Query As String) |
String |
Returns the first cell as String, or "" if no rows |
GetGuidValue |
(Query As String) |
Guid |
Returns the first cell as Guid, or Guid.Empty if no rows |
GetObjectValue |
(Query As String) |
Object |
Returns the first cell as Object, or Nothing if no rows |
GetNewNumber |
(TableName, FieldName, Condition, DefaultNumber) |
Long |
Returns MAX(FieldName) + 1. Useful for sequential numbering |
FieldValueExists |
(TableName, FieldName, value, Condition) |
Boolean |
Returns True if any row matches the value in the field |
FieldValueExists |
(TableName, FieldName, value, Condition, condition2, condition3) |
Boolean |
Same with up to three AND conditions |
IsIdentityField |
(tableName, columnName) |
Boolean |
Returns True if the column is a SQL IDENTITY column |
DBString |
(InVal As String) |
String |
Escapes single quotes for safe SQL embedding |
Example
Dim conn As New SqlConnection.SqlConnection(".", "MyDB", "sa", "pass", False)
' Simple query → DataTable
Dim dt = conn.ExecuteQuery("SELECT * FROM Products")
' Typed query → List(Of T)
Dim products = conn.ExecuteQuery(Of Product)("SELECT * FROM Products WHERE Active = 1")
' Single value
Dim total As Double = conn.GetValue("SELECT SUM(Amount) FROM Orders")
' Insert / Update
conn.ExecuteNonQuery("INSERT INTO Log (Msg) VALUES (N'Started')")
' Transaction
conn.ConnectionInfo.UseConnectedEnvironment = True
Dim tx = conn.BeginTrans()
Try
conn.ExecuteNonQuery("UPDATE Stock SET Qty = Qty - 1 WHERE Id = 5")
conn.CommitTrans(tx)
Catch
conn.RollBack(tx)
End Try
QueryBuilder(Of T)
Namespace: (root)
A fluent, strongly-typed SQL query builder that generates and executes SELECT statements.
The table name is derived from GetType(T).Name.
Constructor
New(Connection As SqlConnection.SqlConnection)
WHERE Clauses (chainable)
| Method | Description |
|---|---|
Where(propExpr, op, value) |
Adds [Column] {op} {value} — op examples: "=", ">", "<>" |
WhereIn(propExpr, values) |
Adds [Column] IN (v1, v2, ...) |
WhereNotIn(propExpr, values) |
Adds [Column] NOT IN (v1, v2, ...) |
WhereContains(propExpr, value) |
Adds [Column] LIKE '%value%' |
WhereNotContains(propExpr, value) |
Adds [Column] NOT LIKE '%value%' |
WhereStartsWith(propExpr, value) |
Adds [Column] LIKE 'value%' |
WhereEndsWith(propExpr, value) |
Adds [Column] LIKE '%value' |
All conditions are combined with
AND.
ORDER BY Clauses (chainable)
| Method | Description |
|---|---|
OrderByAscending(propExpr) |
Sets primary ORDER BY [Column] ASC |
OrderByDescending(propExpr) |
Sets primary ORDER BY [Column] DESC |
ThenByAscending(propExpr) |
Adds secondary [Column] ASC |
ThenByDescending(propExpr) |
Adds secondary [Column] DESC |
Execution Methods
| Method | Returns | Description |
|---|---|---|
ToSql() |
String |
Returns the generated SQL string without executing it |
ToList() |
List(Of T) |
Executes and returns all matching rows |
FirstOrDefault() |
T |
Returns the first row, or Nothing |
SingleOrDefault() |
T |
Returns exactly one row; throws if more than one match |
Any() |
Boolean |
Returns True if at least one row matches |
Count() |
Integer |
Returns the count of matching rows |
Example
Dim conn As New SqlConnection.SqlConnection(info)
Dim results = New QueryBuilder(Of Product)(conn) _
.Where(Function(p) p.CategoryId, "=", 3) _
.WhereContains(Function(p) p.Name, "chair") _
.OrderByAscending(Function(p) p.Name) _
.ToList()
Dim sql = New QueryBuilder(Of Order)(conn) _
.Where(Function(o) o.Date, ">=", #1/1/2024#) _
.WhereIn(Function(o) o.StatusId, {1, 2, 3}) _
.ToSql()
' → SELECT * FROM Order WHERE Date >= '2024-01-01 00:00:00' AND StatusId IN (1, 2, 3)
CommandBuilder
Namespace: WiseProgress.Data.CommandBuilder
Implements: IDisposable
Builds INSERT, UPDATE, SELECT, and DELETE SQL command strings from field/value pairs, class instances, or full object graphs with child collections. Handles type formatting, null safety, value sanitization, and emits efficient multi-row INSERT statements when inserting multiple rows into the same table.
Annotations
DatabaseIdentityAttribute
Namespace: WiseProgress.Data.Annotations
Marks a property as a SQL Server IDENTITY column. Excluded from all INSERT and UPDATE commands.
<DatabaseIdentity>
Public Property Id As Integer
DatabaseChildListAttribute
Namespace: WiseProgress.Data.Annotations
Marks a List(Of T) property as an explicit child collection. Used only by the annotated workflow (GetInsertCommandWithChildren / GetUpdateCommandWithChildren). Not required when using HandleListAsChildren.
<DatabaseChildList>
Public Property Lines As List(Of PurchaseInvoiceLine)
Constructors
New()
New(Table As String)
Properties
| Property | Type | Description |
|---|---|---|
TableName |
String |
Target table name. Auto-set from T's type name when using AddValuesOfClass. |
FieldCount |
Integer (ReadOnly) |
Number of fields currently staged. |
HandleListAsChildren |
Boolean |
When True, the next GetInsertCommand(obj) call automatically treats every List(Of T) property as a child collection — no annotation required. Resets to False automatically after the command is generated. |
Fluent Helper
| Method | Returns | Description |
|---|---|---|
WithChildLists() |
CommandBuilder |
Sets HandleListAsChildren = True and returns Me for use in a one-liner fluent call. |
Field Management
| Method | Description |
|---|---|
Clear() |
Clears all staged fields so the builder can be reused. |
ContainsField(FieldName) |
Returns True if a field with the given name has been staged. |
RemoveValue(FieldName) |
Removes a specific staged field by name. |
Staging Values
| Method | Description |
|---|---|
SetValue(FieldName, Value, FieldType) |
Stages a field with an explicit enFieldType. |
SetValue(FieldName, Value) |
Stages a field as Text (convenience overload). |
AddValue(FieldName, arg, [DataType]) |
Stages a field, auto-detecting the type from the value or an optional type name string. |
AddValue(FieldName, Value, FieldType) |
Stages a field with an explicit enFieldType, formatting the value for SQL. |
AddValuesOfClass(Of T)(obj) |
Reflects over all writable properties of obj and stages each one, skipping DatabaseIdentity properties and any List(Of T) / array properties. |
AddValuesOfClass(Of T)(obj As List(Of T)) |
Calls AddValuesOfClass for each item in the list. |
enFieldType Enum
| Value | SQL format produced |
|---|---|
Number |
Raw numeric value (e.g. 42, 3.14). Null → 0. |
Text |
N'value' with single-quote escaping. Null → N''. |
SearchText |
LIKE '%value' — used for WHERE conditions. |
Date |
'yyyy-MM-dd'. Null → NULL. |
DateTime |
'yyyy-MM-dd HH:mm:ss'. Null → NULL. |
Time |
'HH:mm:ss' from a TimeSpan. |
Guid |
'xxxxxxxx-…'. Null → NULL. |
Bit |
1 or 0. |
Command Generation Methods
| Method | Description |
|---|---|
GetInsertCommand() |
Builds INSERT INTO TableName (…) VALUES (…) from staged fields. |
GetInsertCommand(Of T)(obj) |
Clears fields, loads from obj, returns an INSERT command. If HandleListAsChildren is True, all List(Of T) properties are treated as child collections automatically. |
GetInsertCommand(Of T)(obj As List(Of T)) |
Emits a single multi-row INSERT INTO … VALUES (…),(…),… for the whole list. If HandleListAsChildren is True, emits a parent+children batch per item instead. |
GetInsertCommandWithChildren(Of T)(obj) |
Explicit / annotated path. Batch: parent INSERT + one multi-row INSERT per child collection marked with <DatabaseChildList>. |
GetUpdateCommand(UpdateCondition) |
Builds UPDATE TableName SET … {condition}. Supply the full WHERE clause. |
GetUpdateCommandWithChildren(obj, UpdateCondition, ChildDeleteCondition) |
Explicit / annotated path. Batch: parent UPDATE + DELETE + multi-row re-INSERT for each <DatabaseChildList> collection. |
GetDeleteCommand(DeleteCondition) |
Builds DELETE FROM TableName {condition}. Supply the full WHERE clause. |
GetSelectCommand(FieldsToReturn) |
Builds SELECT {fields} FROM TableName WHERE … using staged fields as equality filters. |
GetWhereCondition() |
Returns only the WHERE body (without WHERE keyword). Supports LIKE for SearchText fields. |
Child Collection Workflows
Workflow A — HandleListAsChildren (annotation-free)
Set HandleListAsChildren = True before calling GetInsertCommand. Every List(Of T) property is discovered automatically and emitted as a multi-row INSERT. No attribute needed on the model.
Workflow B — Explicit annotated methods
Decorate child list properties with <DatabaseChildList> and call GetInsertCommandWithChildren or GetUpdateCommandWithChildren. Use this when you need selective control over which collections are treated as children.
Performance
- Multi-row INSERT — All rows for the same table are combined into a single
INSERT INTO … VALUES (r1),(r2),(r3)statement. - Reflection caching —
AddValuesOfClasscaches the filteredPropertyInfo[]for each type on first use, skippingGetProperties()on subsequent calls. - Method caching — The
AddValuesOfClassgenericMethodInfoused by child-batch methods is resolved once at class load. - Zero-allocation SQL building — All builders use
StringBuilderwithsb.Length -= 1to remove trailing commas.
Examples
Manual field staging
Using cb As New CommandBuilder("Products")
cb.AddValue("Name", "Widget", CommandBuilder.enFieldType.Text)
cb.AddValue("Price", 9.99, CommandBuilder.enFieldType.Number)
cb.AddValue("CreatedAt", Now, CommandBuilder.enFieldType.DateTime)
Dim sql = cb.GetInsertCommand()
' → INSERT INTO Products ( [Name], [Price], [CreatedAt]) VALUES ( N'Widget', 9.99, '2024-03-15 10:30:00')
conn.ExecuteNonQuery(sql)
End Using
Single object — INSERT and UPDATE
Dim p As New Product With {.Name = "Gadget", .Price = 19.99}
Using cb As New CommandBuilder()
Dim insertSql As String = cb.GetInsertCommand(p)
cb.AddValuesOfClass(p)
Dim updateSql As String = cb.GetUpdateCommand("WHERE Id = 1")
conn.ExecuteNonQuery(insertSql)
End Using
List of objects — multi-row INSERT
Dim people As New List(Of Person) From {
New Person With {.Name = "Alice", .Age = 30},
New Person With {.Name = "Bob", .Age = 25}
}
Using cb As New CommandBuilder("Person")
Dim sql As String = cb.GetInsertCommand(people)
' → INSERT INTO Person ( [Name], [Age]) VALUES ( N'Alice', 30), ( N'Bob', 25)
conn.ExecuteNonQuery(sql)
End Using
Parent + children — annotation-free (HandleListAsChildren)
' No attribute needed on Header.Lines
Using cb As New CommandBuilder()
cb.HandleListAsChildren = True
Dim sql As String = cb.GetInsertCommand(header) ' flag auto-resets
conn.ExecuteNonQuery(sql)
End Using
' Fluent one-liner
Using cb As New CommandBuilder()
conn.ExecuteNonQuery(cb.WithChildLists().GetInsertCommand(header))
End Using
Parent + children — explicit annotated workflow
Public Class PurchaseInvoice
<DatabaseIdentity>
Public Property Id As Integer
Public Property Number As String
Public Property InvoiceDate As Date
<DatabaseChildList>
Public Property Lines As List(Of PurchaseInvoiceLine)
<DatabaseChildList>
Public Property Freights As List(Of PurchaseInvoiceFreight)
End Class
' INSERT
Using cb As New CommandBuilder()
conn.ExecuteNonQuery(cb.GetInsertCommandWithChildren(invoice))
End Using
' UPDATE (DELETE + re-INSERT children)
Using cb As New CommandBuilder()
Dim sql As String = cb.GetUpdateCommandWithChildren(
invoice,
"WHERE Id = 5",
Function(tableName) "WHERE InvoiceId = 5")
conn.ExecuteNonQuery(sql)
End Using
CommandBuilderList
Namespace: WiseProgress.Data.CommandBuilder
Implements: IDisposable
A container that accumulates SQL command strings and executes them as a single batch.
Methods
| Method | Signature | Description |
|---|---|---|
AddCommand |
(Command As String) |
Appends a SQL statement to the list. |
CommandsForExecution |
() As String |
Returns all commands joined by ; for batch execution. |
Clear |
() |
Removes all stored commands. |
Example
Using list As New CommandBuilderList()
list.AddCommand(cb1.GetInsertCommand())
list.AddCommand(cb2.GetUpdateCommand("WHERE Id = 5"))
conn.ExecuteNonQuery(list.CommandsForExecution())
End Using
SqlManagement.Server
Namespace: WiseProgress.Data.SqlManagement
Exposes SQL Server instance metadata via SERVERPROPERTY.
Constructor
New(ServerConnectionInformation As ConnectionInfo)
Properties (all ReadOnly)
| Property | Type | Description |
|---|---|---|
VersionNumber |
String |
Full version string, e.g. "16.0.1000.6" |
Version |
SqlServerVersion |
Enum value mapping the major version number |
Collation |
String |
Server collation name |
Edition |
String |
Server edition (e.g. "Developer Edition") |
EngineEdition |
String |
Engine edition identifier |
InstanceName |
String |
Named instance name |
IsClustered |
Boolean |
Whether the instance is in a failover cluster |
IsFullTextInstalled |
Boolean |
Whether Full-Text Search is installed |
IsIntegratedSecurityOnly |
Boolean |
Whether only Windows auth is allowed |
IsSingleUser |
Boolean |
Whether the server is in single-user mode |
LicenseType |
String |
License type string |
SqlServerVersion Enum
| Value | SQL Server Year |
|---|---|
SqlServer7 |
SQL Server 7 |
SqlServer2000 |
SQL Server 2000 |
SqlServer2005 |
SQL Server 2005 |
SqlServer2008 |
SQL Server 2008 |
SqlServer2012 |
SQL Server 2012 |
SqlServer2014 |
SQL Server 2014 |
SqlServer2016 |
SQL Server 2016 |
SqlServer2017 |
SQL Server 2017 |
SqlServer2019 |
SQL Server 2019 |
SqlServer2021 |
SQL Server 2021+ |
Example
Dim srv As New SqlManagement.Server(info)
Console.WriteLine(srv.VersionNumber) ' "16.0.1000.6"
Console.WriteLine(srv.Version) ' SqlServer2021
Console.WriteLine(srv.Edition) ' "Developer Edition (64-bit)"
DatabaseComparer
Namespace: (root)
Compares two SQL Server databases and synchronizes the destination to match the source schema (tables, columns, views, functions, stored procedures).
Constructor
New(sourceConnectionString As String, destinationConnectionString As String)
Methods
| Method | Description |
|---|---|
CompareAndUpdate() |
Compares source and destination. Creates missing tables/views/functions/procedures in destination. Adds missing columns to existing tables |
What it compares
| Object type | Missing in destination | Column mismatch |
|---|---|---|
| Tables | Creates table | Adds missing columns |
| Views | Creates view | Compares columns |
| Functions | Creates function | — |
| Stored Procedures | Creates procedure | — |
Example
Dim comparer As New DatabaseComparer(
"Server=source;Database=MyDB_Dev;Integrated Security=True",
"Server=dest;Database=MyDB_Prod;Integrated Security=True")
comparer.CompareAndUpdate()
' Missing tables/columns/views/functions/procs in Prod are created from Dev
Type Mapping (ExecuteQuery(Of T))
When mapping DataTable rows or SqlDataReader to typed objects, column names are matched to property names case-insensitively. The following conversions are handled automatically:
| SQL Type | .NET Property Type | Conversion |
|---|---|---|
float / real |
Decimal |
Convert.ToDecimal |
decimal / money |
Double |
Convert.ToDouble |
int |
Integer |
Convert.ToInt32 |
bigint |
Long |
Convert.ToInt64 |
smallint |
Short |
Convert.ToInt16 |
tinyint |
Byte |
Convert.ToByte |
bit |
Boolean |
direct |
uniqueidentifier |
Guid |
direct |
nvarchar / varchar |
String |
direct |
datetime / date |
DateTime |
direct |
| integer enum column | Enum |
Enum.ToObject |
| string enum column | Enum |
Enum.Parse |
NULL database values are silently skipped — the property retains its default value.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
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 |
|---|---|---|
| 2026.5.21.1 | 194,077 | 5/21/2026 |
| 2026.5.16.1 | 72,168 | 5/16/2026 |
| 2026.4.27.1 | 205,436 | 4/27/2026 |
| 2026.4.19.1 | 109,403 | 4/18/2026 |
| 2026.3.20.1 | 220,385 | 3/20/2026 |
| 2026.3.1.1 | 248,238 | 3/1/2026 |
| 2026.2.18.1 | 128,240 | 2/18/2026 |
| 2026.2.15.2 | 40,663 | 2/15/2026 |
| 2026.2.15.1 | 3,562 | 2/15/2026 |
| 2026.2.14.2 | 11,136 | 2/14/2026 |
| 2026.2.14.1 | 123 | 2/14/2026 |
| 2026.2.7.1 | 85,256 | 2/7/2026 |
| 2026.1.20.1 | 238,247 | 1/20/2026 |
| 2026.1.17.1 | 34,106 | 1/17/2026 |
| 2025.8.28.1 | 1,829,193 | 8/28/2025 |
| 2025.3.27.1 | 4,425,196 | 3/27/2025 |
| 2025.3.25.1 | 578 | 3/25/2025 |
| 2025.3.24.1 | 609 | 3/24/2025 |
| 2025.3.23.1 | 361 | 3/23/2025 |
| 2025.3.20.1 | 9,561 | 3/20/2025 |