С помощью лицензирования авторы элементов могут защитить свою интеллектуальную собственность путем проверки, имеет ли разработчик право использовать данный элемент. Эту проверку важнее выполнять во время разработки, когда разработчик встраивает элемент в приложение, чем во время выполнения. Если разработчик законно использует лицензированный элемент во время разработки, приложение разработчика получает лицензию на выполнение, которая может свободно распространяться.
Платформа .NET Framework предлагает модель лицензирования, одинаковую для всех компонентов и элементов управления (включая элементы управления Windows Forms) и полностью совместимую с моделью лицензирования элементов управления Microsoft ActiveX®. Однако, следует отметить, что .NET Framework не реализует защиту, а предоставляет механизм её реализации.
Библиотека .NET Framework разделяет логику проверки лицензии от кода самого компонента с помощью провайдера лицензий (license provider), представленного классом System.ComponentModel.LicenseProvider. Класс LicenseProvider является базовым абстрактным классом для всех провайдеров лицензий. Единственным его методом является метод GetLicense(), возвращающий экземпляр класса License:
public abstract License GetLicense(LicenseContext context, Type type, object instance, bool allowexceptions);
Для реализации защиты элемента при помощи текстового файла лицензии мы воспользуемся классом LicFileLicenseProvider. Класс LicFileLicenseProvider реализует простейшую защиту: если в каталоге, где расположен элемент, присутствует файл специального формата, лицензия считается корректной. Формат файла очень простой: имя файла должно быть в формате <пространство_имен>.<тип_элемента>.lic файл должен содержать строку: <пространство_имен>.<тип_элемента> is a licensed component. Подключение провайдера лицензий к классу элемента производится с помощью добавления атрибута LicenseProvider:
[LicenseProvider(typeof(LicFileLicenseProvider))]
public class Example : ElementClass
{
...
}
License license = LicenseManager.Validate(this.GetType(), this);
Попытаемся после компиляции открыть схему, которая содержит наш элемент, например такую:
Add(hcTplForm,2953706,21,105)
{
StartPosition=4
}
Add(Example,2,126,105)
{
Greeting="Hello!"
link(onGreeting,7:doWork2,[])
link(Data,5:Text,[])
}
Add(hcTplButton,3,70,105)
{
Left=36
Top=23
link(onClick,2:doSayHello,[])
}
Add(hcMessage,4,182,105)
{
link(Caption,2:Greeting,[(195,91)(167,91)(167,150)(132,150)])
}
Add(HubEx,7,168,105)
{
link(onEvent,4:doMessage,[])
}
Add(HCMaskedTextBox,5,126,49)
{
Left=97
Top=23
Mask="00/00/0000"
link(onMaskInputRejected,7:doWork1,[(172,55)])
}
Использовать элемент нельзя до тех пор пока мы не поместим рядом со сборкой файла свой файл лицензии с именем ElementVirtual.Example.lic и следующего содержания:
ElementVirtual.Example is a licensed component.
Разумеется, назвать это защитой сложно, но этот класс дает возможность реализовать собственный механизм защиты, перекрыв виртуальный метод:
protected virtual bool IsKeyValid(string key, Type type);
Можете скачать полный код проекта элемента: MyElementCore.zip