Вверх ↑
Главный модератор
Ответов: 2997
Рейтинг: 395
#1: 2020-01-18 14:45:42 ЛС | профиль | цитата
    Лицензирование элемента

  С помощью лицензирования авторы элементов могут защитить свою интеллектуальную собственность путем проверки, имеет ли разработчик право использовать данный элемент. Эту проверку важнее выполнять во время разработки, когда разработчик встраивает элемент в приложение, чем во время выполнения. Если разработчик законно использует лицензированный элемент во время разработки, приложение разработчика получает лицензию на выполнение, которая может свободно распространяться.

  Платформа .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);
  Первый параметр этого метода, context, предоставляет сервис для работы с лицензиями, второй параметр передает тип лицензируемого компонента, а третий параметр экземпляр самого компонента. Последний параметр разрешает генерацию исключений, если файл лицензии некорректен.

  Для реализации защиты элемента при помощи текстового файла лицензии мы воспользуемся классом LicFileLicenseProvider. Класс LicFileLicenseProvider реализует простейшую защиту: если в каталоге, где расположен элемент, присутствует файл специального формата, лицензия считается корректной. Формат файла очень простой: имя файла должно быть в формате <пространство_имен>.<тип_элемента>.lic файл должен содержать строку: <пространство_имен>.<тип_элемента> is a licensed component. Подключение провайдера лицензий к классу элемента производится с помощью добавления атрибута LicenseProvider:
[LicenseProvider(typeof(LicFileLicenseProvider))]
public class Example : ElementClass
{
...
}
  Само по себе добавление атрибута еще не означает включение механизма проверки лицензии. Это просто определение провайдера лицензий. Для проверки правильности лицензии используется вызов метода Validate() класса LicenseManager:
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', но для типа 'ElementVirtual.Example' не может предоставляться действительной лицензии. За дополнительной информацией обращайтесь к поставщику компонента.»:

  Использовать элемент нельзя до тех пор пока мы не поместим рядом со сборкой файла свой файл лицензии с именем ElementVirtual.Example.lic и следующего содержания:
ElementVirtual.Example is a licensed component.
  Теперь попытка открыть схему будет удачной:

  Разумеется, назвать это защитой сложно, но этот класс дает возможность реализовать собственный механизм защиты, перекрыв виртуальный метод:
protected virtual bool IsKeyValid(string key, Type type);
  В реализации наследника можно (и нужно) использовать более сложный механизм, чем простое сравнение строк. К тому же не следует забывать что, если Ваш код можно декомпилировать, то относительно легко обойти большинство систем лицензирования. Конечно, это при условии что Вы хорошо разбираетесь в этом.

  Можете скачать полный код проекта элемента: MyElementCore.zip
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
1
Голосовали:Konst
Редактировалось 6 раз(а), последний 2020-01-18 16:44:42