1. Préparez les paramètres du produit et une licence de test
Ajoutez des clés de licence client et des droits par fonctionnalité à votre application C#/.NET ou WinForms. Ce guide concerne l'accès à votre logiciel commercial ; choisir une licence open source pour le code est une décision distincte. Commencez par une licence liée à l'appareil et une fonction d'export sans compteur d'utilisation.
Le quota compte les activations actuelles et est rendu à leur libération. Les licences ordinaires restent comptées hors ligne ; les licences flottantes rendent aussi le quota à l’expiration du bail.
- Copiez l’ID du produit dans Console > Produits. Ouvrez les clés publiques de signature du même produit et collez toutes les paires ID de clé/clé publique dans le code d’initialisation, en remplaçant YOUR_PRODUCT_ID, YOUR_KEY_ID et YOUR_PUBLIC_KEY. L’intégration rapide peut générer ce code. Aucun fichier de configuration n’est nécessaire ; le SDK utilise https://www.licentivo.com par défaut.
- Installez le .NET 8 SDK ou version ultérieure. Dans l'intégration Licentivo Quick, créez ou sélectionnez votre produit et autorisez la fonctionnalité d'exportation dans sa politique et sa licence.
2. Installez le package épinglé .NET
Installez le SDK 0.11.6 avec la commande suivante dans votre projet ou ajoutez la dépendance de compilation. Le gestionnaire de paquets récupère le SDK ; aucun ZIP source, aucune extraction manuelle ni aucun chemin local ne sont nécessaires.
dotnet add package Licentivo.SDK --version 0.11.6dotnet new console --name LicensedApp --framework net8.0
cd LicensedApp
dotnet add package Licentivo.SDK --version 0.11.63. Activez et protégez une véritable opération
Initialisez le SDK au démarrage ou lors de l’activation de votre logiciel. Lisez la clé client dans votre formulaire et transmettez l’ID produit et les clés approuvées. Gardez le client jusqu’à la fermeture. Placez RunFeature au point d’entrée métier réel et remplacez l’export par votre fonction.
using Licentivo;
// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
const string ProductId = "YOUR_PRODUCT_ID";
var TrustedKeys = new Dictionary<string,string> { ["YOUR_KEY_ID"] = "YOUR_PUBLIC_KEY" };
// END LICENTIVO PRODUCT
static string Setting(string name, string fallback) => Environment.GetEnvironmentVariable(name) ?? fallback;
// Call at the business entry point, including shortcuts and alternate menu actions.
static async Task ExportReport(string path)
{
// Replace this write with your existing, non-metered export operation.
await File.WriteAllTextAsync(path, "A report generated by the licensed application.\n");
}
try
{
// In a GUI, read the activation input. Later starts pass an empty key.
await using var client = await LicentivoClient.OpenProduct(
ProductId, TrustedKeys, Setting("LICENTIVO_LICENSE_KEY", ""),
error => Console.Error.WriteLine($"Background verification: {error.Message}"));
var feature = Setting("LICENTIVO_FEATURE", "export");
var path = Setting("LICENTIVO_OUTPUT", "licensed-report.txt");
if (Setting("LICENTIVO_METERED", "") == "1")
await client.RunMeteredFeature(feature, 1, Setting("LICENTIVO_OPERATION_ID", ""), () => ExportReport(path));
else
await client.RunFeature(feature, () => ExportReport(path));
Console.WriteLine($"License OK: {feature} is available\nExport completed: {path}");
// Keep client alive in your real app; disposal belongs in app shutdown.
}
catch (Exception error)
{
Console.Error.WriteLine(error.Message);
Environment.ExitCode = 2;
}
$env:LICENTIVO_LICENSE_KEY = 'YOUR_TEST_LICENSE_KEY'
dotnet run
# On later starts, restore the saved device credential:
Remove-Item Env:LICENTIVO_LICENSE_KEY
dotnet runexport LICENTIVO_LICENSE_KEY='YOUR_TEST_LICENSE_KEY'
dotnet run
# On later starts, restore the saved device credential:
unset LICENTIVO_LICENSE_KEY
dotnet run4. Connectez l'activation et l'exportation vers WinForms
Dans chaque point d’entrée d’exportation, attendez client.RunFeature("export", ExportReport). Incluez les éléments de menu et les raccourcis. Désactivez le bouton de lancement pendant l'exécution d'une opération, détectez les erreurs et affichez le refus avant d'autoriser une autre tentative.
Gardez le client en vie pendant que la fenêtre est ouverte afin que SDK pulsations puissent actualiser l'autorisation. Marshalez les messages d’erreur en arrière-plan sur le thread de l’interface utilisateur avec Invoke ou BeginInvoke. Attendez DisposeAsync à l’arrêt de l’application ; l'élimination normale conserve un enregistrement lié à l'appareil et tente de restituer un siège flottant.
Un exemple d'application de bureau est proposé séparément via le lien vers la documentation ci-dessous. WinForms nécessite Windows ; l'exemple en console ci-dessus fonctionne aussi sous Linux et macOS.
dotnet new winforms --name LicensedWinForms --framework net8.0
cd LicensedWinForms
dotnet add package Licentivo.SDK --version 0.11.6using Licentivo;
namespace LicensedWinForms;
sealed class DemoForm : Form {
// BEGIN LICENTIVO PRODUCT
// Console > Products > Signing public keys: paste Product ID and every key ID/public key pair.
const string ProductId = "YOUR_PRODUCT_ID";
static readonly Dictionary<string,string> TrustedKeys = new() { ["YOUR_KEY_ID"] = "YOUR_PUBLIC_KEY" };
// END LICENTIVO PRODUCT
readonly TextBox key = new() { Width = 380, UseSystemPasswordChar = true };
readonly Label status = new() { AutoSize = true, MaximumSize = new Size(550, 0), Text = "Enter a key, or leave empty to restore this device." };
readonly CancellationTokenSource lifetime = new();
LicentivoClient? client;
bool busy;
[STAThread] static void Main() { ApplicationConfiguration.Initialize(); Application.Run(new DemoForm()); }
DemoForm() {
Text = "Licentivo · Report export"; ClientSize = new Size(600, 220);
var panel = new FlowLayoutPanel { Dock = DockStyle.Fill, Padding = new Padding(20), FlowDirection = FlowDirection.TopDown, WrapContents = false, AutoScroll = true };
Controls.Add(panel); panel.Controls.Add(new Label { Text = "Customer license key", AutoSize = true }); panel.Controls.Add(key);
Add(panel, "Activate / restore", async () => {
if (client is not null) { await client.DisposeAsync(); client = null; }
client = await LicentivoClient.OpenProduct(ProductId, TrustedKeys, key.Text, ct: lifetime.Token);
key.Clear(); status.Text = client.Status().State;
});
var buttons = new FlowLayoutPanel { AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, WrapContents = false }; panel.Controls.Add(buttons);
Add(buttons, "Export CSV", () => Export("export", "report.csv"));
Add(buttons, "Pro export", () => Export("pro", "pro-report.csv"));
Add(buttons, "Refresh license", async () => { await Require().RefreshOnline(lifetime.Token); status.Text = Require().Status().State; });
panel.Controls.Add(status);
FormClosed += async (_, _) => { lifetime.Cancel(); if (client is not null) await client.DisposeAsync(); };
}
LicentivoClient Require() => client ?? throw new InvalidOperationException("Activate the application first.");
async Task Export(string feature, string filename) {
using var save = new SaveFileDialog { FileName = filename, Filter = "CSV report|*.csv" };
await Require().RunFeature(feature, async () => {
if (save.ShowDialog(this) != DialogResult.OK) return;
await File.WriteAllTextAsync(save.FileName, "Item,Quantity,Price\nNotebook,2,12.50\nPen,5,3.00\n");
status.Text = "Saved: " + save.FileName;
});
}
void Add(Control panel, string title, Func<Task> action) {
var button = new Button { Text = title, AutoSize = true }; panel.Controls.Add(button);
button.Click += async (_, _) => {
if (busy) return; busy = true; status.Text = "Working…";
try { await action(); } catch (Exception error) { if (!IsDisposed) status.Text = error.Message; }
finally { busy = false; }
};
}
}
dotnet runGérez l'utilisation simultanée de logiciels avec des licences flottantes
5. Vérifiez l'activation, le redémarrage et le refus
- Exécutez avec votre clé de test et confirmez Licence OK et Exportation terminée, puis inspectez le contenu du rapport.
- Supprimez la variable d'environnement clé et redémarrez sous le même utilisateur du système d'exploitation. Les informations d'identification de l'appareil existantes doivent être restaurées sans nouvel appareil enregistré.
- Utilisez LICENTIVO_FEATURE pour sélectionner une fonctionnalité absente de la licence et LICENTIVO_OUTPUT pour sélectionner un nouveau nom de fichier. Confirmez un code de sortie différent de zéro et que ce nouveau fichier n'est jamais créé.
- Vérifiez le démarrage hors ligne uniquement avec une stratégie qui le permet et un cache signé valide. Le démarrage flottant et en ligne uniquement nécessite l'approbation du serveur.
Limitez les exports de fichiers avec un compteur d'utilisation mensuel
Résoudre les problèmes de vérification des licences
Vérifiez l’ID produit, toutes les paires ID de clé/clé publique et la licence du client. Les clés publiques appartiennent au produit ; licences et identifiants des appareils sont distincts. Ne distribuez pas de clés de test ou de clés API de gestion.
Une licence expirée, une limite d'appareils ou une fonctionnalité manquante constitue un refus d'autorisation. Affichez l'erreur et l'ID de demande, et résolvez la licence ou la stratégie dans la console au lieu de contourner RunFeature.
Pour les limites d'utilisation mensuelles, conservez un ID de tâche stable et un résultat commercial durable lorsque vous appelez RunMeteredFeature. L'arrêt normal de l'application et la désactivation demandée par le client ont des objectifs différents ; ne publiez pas d’enregistrement lié à l’appareil à chaque sortie.