1. قم بإعداد إعدادات المنتج وترخيص الاختبار
أضف مفاتيح ترخيص العملاء وصلاحيات الميزات إلى تطبيق C#/.NET أو WinForms الخاص بك. يتناول هذا الدليل حق استخدام برنامجك التجاري؛ أما اختيار ترخيص مفتوح المصدر للشيفرة فهو قرار مستقل. ابدأ بترخيص مرتبط بالجهاز وميزة تصدير دون احتساب للاستخدام.
تُحسب حصة الأجهزة من التفعيلات الحالية وتعود عند التحرير. تبقى التراخيص العادية محسوبة دون اتصال، وتعيد التراخيص العائمة الحصة تلقائيًا أيضًا عند انتهاء الإيجار.
- انسخ معرّف المنتج من لوحة التحكم > المنتجات. افتح مفاتيح التوقيع العامة للمنتج نفسه والصق جميع أزواج معرّف المفتاح والمفتاح العام في كود التهيئة بدلاً من YOUR_PRODUCT_ID وYOUR_KEY_ID وYOUR_PUBLIC_KEY. يمكن للتكامل السريع توليد هذا الكود. لا يلزم ملف إعداد للمنتج؛ يتصل SDK افتراضياً بـ https://www.licentivo.com.
- قم بتثبيت .NET 8 SDK أو الأحدث. في التكامل السريع مع Licentivo، قم بإنشاء منتجك أو تحديده والسماح بميزة التصدير في سياسته وترخيصه.
2. قم بتثبيت الحزمة .NET المثبتة
ثبّت SDK 0.11.6 بتشغيل الأمر أدناه داخل مشروع تطبيقك أو بإضافة تبعية البناء. يتولى مدير الحزم جلب SDK؛ لا حاجة إلى تنزيل ملفات المصدر وفك ضغطها أو إعداد مسار محلي.
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. تفعيل وحماية عملية واحدة حقيقية
هيّئ SDK عند بدء برنامجك أو تنشيطه. اقرأ مفتاح العميل من نافذة التنشيط ومرّر معرّف المنتج والمفاتيح الموثوقة. احتفظ بالعميل حتى إغلاق التطبيق. ضع RunFeature عند العملية الفعلية واستبدل التصدير بوظيفتك.
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. قم بتوصيل التنشيط والتصدير إلى WinForms
في كل نقطة دخول للتصدير، انتظر client.RunFeature("export", ExportReport). قم بتضمين عناصر القائمة والاختصارات. قم بتعطيل زر البدء أثناء تشغيل العملية، واكتشف الأخطاء وأظهر الرفض قبل السماح بمحاولة أخرى.
أبقِ العميل على قيد الحياة أثناء فتح النافذة حتى تتمكن SDK من تحديث التفويض. رسائل خطأ الخلفية Marshal على مؤشر ترابط واجهة المستخدم باستخدام Invoc أو BeginInvoc. انتظر DisposeAsync عند إيقاف تشغيل التطبيق؛ يحتفظ التخلص العادي بالتسجيل المرتبط بالجهاز ويحاول إعادة المقعد العائم.
يتوفر مثال مستقل لتطبيق سطح المكتب عبر رابط التوثيق أدناه. يتطلب WinForms نظام Windows؛ ويعمل مثال وحدة التحكم أعلاه أيضًا على Linux و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 run5. التحقق من التنشيط وإعادة التشغيل والرفض
- قم بالتشغيل باستخدام مفتاح الاختبار الخاص بك وتأكد من موافق الترخيص واكتمل التصدير، ثم افحص محتويات التقرير.
- قم بإزالة متغير البيئة الرئيسي وأعد التشغيل تحت نفس مستخدم نظام التشغيل. يجب استعادة بيانات اعتماد الجهاز الحالية بدون جهاز مسجل جديد.
- استخدم LICENTIVO_FEATURE لتحديد ميزة غير موجودة في الترخيص وLICENTIVO_OUTPUT لتحديد اسم ملف جديد. قم بتأكيد رمز الخروج غير الصفري وعدم إنشاء هذا الملف الجديد مطلقًا.
- تحقق من بدء التشغيل دون اتصال فقط باستخدام سياسة تسمح بذلك وذاكرة تخزين مؤقت موقعة صالحة. يتطلب بدء التشغيل العائم وعبر الإنترنت فقط موافقة الخادم.
استكشاف أخطاء فحص الترخيص وإصلاحها
تحقق من معرّف المنتج وجميع أزواج معرّف المفتاح والمفتاح العام وترخيص العميل. المفاتيح العامة تخص المنتج؛ التراخيص وبيانات اعتماد الأجهزة منفصلة. لا توزّع مفاتيح الاختبار أو مفاتيح API الإدارية.
يعد الترخيص منتهي الصلاحية أو حد الجهاز أو الميزة المفقودة بمثابة رفض للترخيص. أظهر الخطأ ومعرف الطلب، وقم بحل الترخيص أو السياسة في وحدة التحكم بدلاً من تجاوز RunFeature.
بالنسبة لحدود الاستخدام الشهري، احتفظ بمعرف وظيفة ثابت ونتائج عمل دائمة عند الاتصال بـ RunMeteredFeature. لإيقاف التشغيل العادي للتطبيق وإلغاء التنشيط الذي يطلبه العميل أغراض مختلفة؛ لا تقم بتحرير تسجيل مرتبط بالجهاز عند كل مخرج.