Sni.DelWoods Ответов: 3

C#: как реализовать простой лицензионный ключ / вызов checklicence()


Есть ли способ вызвать метод CheckLicence() автоматически в каждом методе статического класса?

У меня есть несколько статических классов с сотнями методов.
Таким образом, глобальная проверка лицензии была бы более удобной, чем вызов метода CheckLicence() в каждом методе класса.

Объяснение примера:
LicenceKey устанавливается приложением при запуске.
Так что лицензия в порядке на всю жизнь.

Я хочу избавиться от вызова CheckLicence() в AddMethod().

Фон:
У меня есть большая библиотека инструментов, которая используется в нескольких проектах. Библиотека развернута в моих проектах (веб-сайты, настольные приложения). Я хочу иметь базовую защиту, чтобы DLL не могла напрямую использоваться клиентами в их собственных внутренних проектах.

Что я уже пробовал:

public static class LicensedClass
{
    public static string licenceKey = "";

    public static bool IsLicensed
    {
        get { return (licenceKey == "ABC123"); }
    }

    public static void CheckLicence()
    {
        if (!IsLicensed) 
                throw new System.ArgumentException("Wrong licence key.", licenceKey);
    }

    public static double AddMethod(double number1, double number2)
    {
        CheckLicence();

        return number1 + number2;
    }
}

BillWoodruff

"Есть ли способ вызвать метод CheckLicence() автоматически в каждом методе статического класса?" Если вы сделаете это, у вас будет очень медленное приложение. Зачем вам вообще проверять наличие лицензии при каждом вызове метода?.. это безумие.

Sni.DelWoods

Вы абсолютно правы. Я добавил причину к своему вопросу, так что, возможно, есть лучшее решение этой проблемы.

3 Ответов

Рейтинг:
9

Sni.DelWoods

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

Использование:

DllClassLibrary.License.SetLicense("ABC123");
var result = DllClassLibrary.Foo.DoSomething();

DLL-Class-библиотека с простой проверкой лицензии:
namespace DllClassLibrary
{
    public static class License
    {
        private static bool isLicensed = false;
        public static bool SetLicense(string licenseKey)
        {
            isLicensed = (licenseKey == "ABC123");
            return isLicensed;
        }
        public static void CheckLicense()
        {
            if (!isLicensed)
                throw new Exception("License not set.");
        }
    }
    public static class Foo
    {
        static Foo()
        {
            License.CheckLicense();
        }
        public static string DoSomething()
        {
            return $"[{DateTime.Now.ToString()}] DoFoo()";
        }
    }
}


Рейтинг:
0

OriginalGriff

Нет.

C# не будет вызывать ничего автоматически для вас - вы должны явно сказать ему, что вы хотите вызвать и когда.

Вы всегда можете добавить задачу вторичного потока, которая периодически проверяет ее и отвечает основному потоку индикатором "failed", который он может обработать вместо этого?


Sni.DelWoods

Это может сработать, но я не думаю, что это лучшее решение. В нестатическом классе я бы интегрировал ключ в конструктор и проверил его один раз при создании экземпляра. например, var license = new License("ABC123");
В статическом классе я на самом деле понятия не имею, как это реализовать.

johannesnestler

почему бы не сделать то же самое в статическом контструкторе?

Sni.DelWoods

Статический конструктор не имеет параметров. Я просто хочу добавить очень простой лицензионный ключ для реализации очень простого решения, чтобы избежать того, что другие люди используют мою библиотеку dll в своем собственном проекте. Поэтому достаточно установить простой фиксированный пароль. Простой файл лицензионного ключа, загруженный в construtor, не решит проблему, так как файл может быть легко скопирован.

Рейтинг:
0

RickZeeland

Вы могли бы взглянуть на АОП (Аспектно-Ориентированное Программирование): GitHub - Virtuoze/NConcern: NConcern .NET AOP Framework[^]
Но вы можете обнаружить, что это слишком сложно для того, что вы хотите ...

Другой вариант заключается в использовании хорошо известного PostSharp расширение: PostSharp - Visual Studio Marketplace[^]


Sni.DelWoods

Lib очень интересен, но это слишком много для моей проблемы.

Richard Deeming

К ВАШЕМУ СВЕДЕНИЮ:
"NConcern был переработан, улучшен и стал надежным благодаря Puresharp[^] проект."

RickZeeland

Спасибо Ричард, очень интересно, и, конечно же, есть хорошо известное расширение PostSharp: https://marketplace.visualstudio.com/items?itemName=PostSharpTechnologies-да.PostSharp