This SDK is a commercial product. You have 30 days to test it for free, with every feature available. After that a license key is needed.

## Trial period

The trial starts the first time the library is used on a machine, and lasts 30 days. Nothing has to be registered, and no feature is disabled during that time.

`AbbController.LicenseInfo` tells you where you stand. `EvaluationDaysLeft` counts the days remaining, and becomes negative once the trial has expired.

## Register a license

Buy a license ([see pricing](/order)) and we send you a license key with the name of your organization. Pass both to the static method `RegisterLicense` of `AbbController`, once, before the first connection.

**C# : License**
```csharp
using UnderAutomation.ABB;
using UnderAutomation.ABB.License;

public class License
{
    static void Main()
    {
        /**/
        // Register the license once, before the first connection
        AbbController.RegisterLicense("YourCompanyName", "YOUR_LICENSE_KEY");

        LicenseInfo info = AbbController.LicenseInfo;

        // Number of trial days remaining, null when the product is licensed
        int? evaluationDaysLeft = info.EvaluationDaysLeft;

        bool licenseValid = info.State == LicenseState.Licensed;

        // A readable description of the current state
        Console.WriteLine(info);
        /**/

        /**/
        // Check the license once at startup, rather than catching the exception
        // on every connection
        if (!AbbController.LicenseInfo.IsLicensed)
        {
            Console.WriteLine(AbbController.LicenseInfo);
            return;
        }
        /**/

        /**/
        // Without a key the library runs in its 30 day trial period.
        // Connect throws an InvalidLicenseException once the trial has expired.
        try
        {
            AbbController robot = new AbbController();
            robot.Connect("192.168.0.1");
        }
        catch (InvalidLicenseException ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.LicenseInfo.State);
        }
        /**/
    }
}
```

The registration is static: it applies to the whole application, not to one `AbbController` instance. You can register a key even after the trial period has ended.

`AbbController.LicenseInfo` returns the current state at any moment. Its `ToString()` gives a readable description, which is what an `InvalidLicenseException` carries as its message.

## License states

| `LicenseState`      | Meaning                                                                    | The library runs |
| ------------------- | -------------------------------------------------------------------------- | ---------------- |
| `None`              | No key has been registered and no trial could be started                   | no               |
| `Trial`             | The 30 day trial period is running                                         | yes              |
| `ExtraTrial`        | An extended trial key has been registered                                  | yes              |
| `Expired`           | The trial period is over                                                   | no               |
| `Invalid`           | The organization name and the key do not go together                       | no               |
| `MaintenanceNeeded` | The key is valid, but this release is newer than the maintenance it covers | no               |
| `Licensed`          | The product is licensed                                                    | yes              |

`IsLicensed` is true for `Licensed`, `Trial` and `ExtraTrial`.

A license includes a number of maintenance years. `MaintenanceExpirationDate` is the date up to which a release can be used with that key. Versions released after that date report `MaintenanceNeeded`. The versions you already use keep working, a new key is only needed to move to a newer release.

## What happens without a valid license

`AbbController.Connect` checks the license before opening the connection and throws an `InvalidLicenseException` when it is not valid. The exception message says why, and its `LicenseInfo` property carries the full state.

Test `IsLicensed` at startup rather than catching the exception on every connection, as the code above does.

## API reference