मुख्य सामग्री पर जाएँ
LICENTIVO / INTEGRATION

C# सॉफ़्टवेयर लाइसेंसिंग: .NET और WinForms

अपने .NET 8 या WinForms ऐप में लाइसेंस कुंजी से सक्रियण जोड़ें। NuGet से SDK इंस्टॉल करें, फ़ीचर अनुमतियाँ लागू करें और रीस्टार्ट व अस्वीकृत पहुँच जाँचें।

.NET 8+ · कंसोल और WinFormsअपडेट

1. उत्पाद सेटिंग और परीक्षण लाइसेंस तैयार करें

अपने C#/.NET या WinForms ऐप में ग्राहक की लाइसेंस कुंजी और फ़ीचर अनुमतियाँ जोड़ें। यह गाइड आपके व्यावसायिक सॉफ़्टवेयर के उपयोग की अनुमति से संबंधित है; सोर्स कोड के लिए ओपन-सोर्स लाइसेंस चुनना अलग निर्णय है। पहले डिवाइस से बँधे लाइसेंस और बिना उपयोग-गणना वाले एक्सपोर्ट फ़ीचर से शुरुआत करें।

डिवाइस कोटा वर्तमान सक्रियणों से गिना जाता है और रिलीज़ पर लौटता है। सामान्य लाइसेंस ऑफ़लाइन भी गिने जाते हैं; फ्लोटिंग लाइसेंस की लीज़ समाप्त होने पर भी कोटा अपने आप लौटता है।

  1. कंसोल > उत्पाद से उत्पाद ID कॉपी करें। उसी उत्पाद की हस्ताक्षर सार्वजनिक कुंजियाँ खोलें और हर कुंजी ID/सार्वजनिक कुंजी जोड़ी को आरंभिक कोड में डालें; YOUR_PRODUCT_ID, YOUR_KEY_ID और YOUR_PUBLIC_KEY बदलें। त्वरित एकीकरण यह कोड भी बना सकता है। उत्पाद कॉन्फ़िगरेशन फ़ाइल नहीं चाहिए; SDK डिफ़ॉल्ट रूप से https://www.licentivo.com से जुड़ता है।
  2. .NET 8 SDK या नया संस्करण स्थापित करें। Licentivo त्वरित एकीकरण में उत्पाद बनाएँ या चुनें और नीति व लाइसेंस में export फ़ीचर की अनुमति दें।

2. निश्चित संस्करण वाला .NET पैकेज स्थापित करें

अपने ऐप प्रोजेक्ट में नीचे दिया गया कमांड चलाकर या बिल्ड डिपेंडेंसी जोड़कर SDK 0.11.6 इंस्टॉल करें। पैकेज मैनेजर SDK प्राप्त करता है; सोर्स ZIP डाउनलोड करके निकालने या लोकल सोर्स पाथ सेट करने की ज़रूरत नहीं है।

Terminal
dotnet add package Licentivo.SDK --version 0.11.6
Terminal · new console project
dotnet new console --name LicensedApp --framework net8.0
cd LicensedApp
dotnet add package Licentivo.SDK --version 0.11.6

3. सक्रिय करें और वास्तविक ऑपरेशन सुरक्षित करें

अपने ऐप के शुरू होने या सक्रियण पर SDK आरंभ करें। सक्रियण फ़ॉर्म से ग्राहक की कुंजी पढ़ें और उत्पाद ID तथा विश्वसनीय कुंजियाँ दें। ऐप बंद होने तक क्लाइंट रखें। वास्तविक कार्य के प्रवेश पर RunFeature लगाकर निर्यात उदाहरण की जगह अपना फ़ंक्शन दें।

C# · complete Program.cs
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;
}
Windows · PowerShell
$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 run
Linux / macOS · Bash
export LICENTIVO_LICENSE_KEY='YOUR_TEST_LICENSE_KEY'
dotnet run
# On later starts, restore the saved device credential:
unset LICENTIVO_LICENSE_KEY
dotnet run

4. WinForms में सक्रियण और निर्यात जोड़ें

निर्यात के हर रास्ते पर await client.RunFeature("export", ExportReport) चलाएँ, मेनू और शॉर्टकट पर भी। ऑपरेशन के दौरान उसका बटन निष्क्रिय रखें। त्रुटि पकड़कर अस्वीकृति दिखाने के बाद ही अगला प्रयास दें।

विंडो खुली रहने तक क्लाइंट बनाए रखें ताकि SDK हार्टबीट अनुमति ताज़ा कर सके। पृष्ठभूमि त्रुटियाँ Invoke या BeginInvoke से UI थ्रेड पर दिखाएँ। ऐप बंद होते समय DisposeAsync को await करें। सामान्य निस्तारण डिवाइस-बद्ध पंजीकरण रखता है और फ़्लोटिंग सीट लौटाने की कोशिश करता है।

डेस्कटॉप उदाहरण नीचे दिए दस्तावेज़ लिंक से अलग से उपलब्ध है। WinForms के लिए Windows चाहिए; ऊपर दिया कंसोल उदाहरण Linux और macOS पर भी चलता है।

Windows · new WinForms project
dotnet new winforms --name LicensedWinForms --framework net8.0
cd LicensedWinForms
dotnet add package Licentivo.SDK --version 0.11.6
C# · replace Program.cs
using 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; }
        };
    }
}
Windows · PowerShell
dotnet run

5. सक्रियण, पुनः शुरुआत और अस्वीकृति जाँचें

  1. परीक्षण कुंजी से चलाकर License OK और Export completed देखें, फिर रिपोर्ट की सामग्री जाँचें।
  2. कुंजी वाला पर्यावरण चर हटाकर उसी OS उपयोगकर्ता से पुनः चलाएँ। नया डिवाइस पंजीकरण बनाए बिना मौजूदा क्रेडेंशियल बहाल होना चाहिए।
  3. LICENTIVO_FEATURE में लाइसेंस से अनुपस्थित फ़ीचर और LICENTIVO_OUTPUT में नया फ़ाइल नाम दें। निकास कोड गैर-शून्य हो और वह नई फ़ाइल न बने।
  4. ऑफ़लाइन स्टार्टअप केवल अनुमति देने वाली नीति और मान्य हस्ताक्षरित कैश से जाँचें। फ़्लोटिंग तथा केवल ऑनलाइन स्टार्टअप को सर्वर मंज़ूरी चाहिए।

लाइसेंस जाँच की समस्याएँ

उत्पाद ID, हर कुंजी ID/सार्वजनिक कुंजी जोड़ी और ग्राहक लाइसेंस जाँचें। सार्वजनिक कुंजियाँ उत्पाद की हैं; लाइसेंस और डिवाइस प्रमाण अलग हैं। परीक्षण कुंजियाँ या प्रबंधन API Key वितरित न करें।

समाप्त लाइसेंस, डिवाइस सीमा या अनुपस्थित फ़ीचर अनुमति की अस्वीकृति है। त्रुटि और request ID दिखाएँ तथा कंसोल में लाइसेंस या नीति सुधारें। RunFeature को दरकिनार न करें।

मासिक उपयोग सीमा में RunMeteredFeature बुलाते समय स्थिर job ID और स्थायी वास्तविक परिणाम रखें। सामान्य ऐप निकास और ग्राहक का Deactivate अलग उद्देश्य रखते हैं। हर निकास पर डिवाइस पंजीकरण मुक्त न करें।