- Notas relacionadas
- Información general
- Primeros pasos
- Proveedores de Marketplace
- Clientes de Marketplace
- Pautas de publicación
- Directrices de publicación para automatizaciones listas para usar
- Directrices de publicación para aceleradores de soluciones
- Directrices de publicación para conectores de Integration Service
- Directrices de publicación para plantillas de aplicaciones de Process Mining
- Seguridad y protección de IP
- Otros listados de UiPath
- Node-RED
- Configuración
- Equipos
- Ámbito de Microsoft Teams
- Crear equipo
- Crear equipo a partir de un grupo
- Obtener equipo
- Obtener equipos
- Canales
- Crear canal
- Eliminar canal
- Obtener canal
- Obtener canales
- Actualizar canal
- Charlas
- Obtener chat
- Obtener chats
- Obtener miembros del chat
- Mensajes
- Obtener mensaje
- Obtener mensajes
- Obtener respuestas de mensajes
- Responder mensaje
- Enviar mensaje
- Events
- Crear Evento
- Eliminar Evento
- Obtener evento
- Obtener eventos
- Usuarios
- Obtener presencia del usuario
- Cómo funciona
- Referencias técnicas
- Comience ya
- Configuración
- Referencias técnicas
- Guías de inicio rápido
- Ámbito de Amazon
- Actividades
- Analizar documento de una sola página
- Analizar documento de varias páginas
- Iniciar análisis de documentos
- Obtener estado de análisis de documentos
- Obtener análisis de documentos
- El objeto Detalle de la página
- Cómo funciona
- Referencias técnicas
- Comience ya
- Acerca de
- Configuración
- Referencias técnicas
- Ámbito del reconocedor de formularios de Azure
- Actividades
- Analizar formulario
- Analizar formulario asíncrono
- Obtener resultado del formulario de análisis
- Analizar recibo
- Analizar recepción asíncrona
- Obtener resultado de análisis de recepción
- Analizar diseño
- Analizar diseño asíncrono
- Obtener resultado de análisis de diseño
- Entrenar modelo
- Obtener modelos
- Obtener claves de modelo
- Obtener información del modelo
- Eliminar modelo
- Conectores
- Cómo crear actividades
- Cree su integración

Guía del usuario de Marketplace
Implementación de licencias
Esta sección de documentación te guía a través del proceso de insertar la biblioteca del SDK de licencias en tu paquete de actividades.
Siga los siguientes pasos dependiendo de si su paquete se desarrolló con o sin el Creador de actividades de UiPath:
- se desarrolló con el Creador de actividades de UiPath
- no se desarrolló con el Creador de actividades de UiPath
Your VS Solution needs to be compatible with .Net 4.6.1.
La responsabilidad de la implementación de licencias para .NET 6 o actividades personalizadas compatibles con Windows recae en el proveedor. Marketplace no proporciona una biblioteca de licencias compatible con .NET6. Proporciona una biblioteca de licencias compatible con Windows-Legacy.
In case your package was developed using the UiPath Activity Creator
-
In the ExecuteAsync method of each of your activities, add the validation check unless you have a Scope Activity scenario. If you do have a Scope Activity scenario, you can add the validation check only to that activity if all your activities are subject to licensing.
protected override async Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken) { // Inputs var firstNumber = FirstNumber.Get(context); var secondNumber = SecondNumber.Get(context); // License validation #if !DEBUG //if your package is MyCompany.MyPackageName.Activities.1.0.0.nupkg await Validator.ValidateAsync(context, "MyCompany.MyPackageName.Activities"); #endif /////////////////////////// // Add execution logic HERE /////////////////////////// // Outputs return (ctx) => { }; }protected override async Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken) { // Inputs var firstNumber = FirstNumber.Get(context); var secondNumber = SecondNumber.Get(context); // License validation #if !DEBUG //if your package is MyCompany.MyPackageName.Activities.1.0.0.nupkg await Validator.ValidateAsync(context, "MyCompany.MyPackageName.Activities"); #endif /////////////////////////// // Add execution logic HERE /////////////////////////// // Outputs return (ctx) => { }; }Nota:- The context object can be passed only once and used only in the method it was passed into. For example, after the Validator.ValidateAsync call, it can not be used anymore in the ExecuteAsync method.
- Teniendo en cuenta el requisito anterior, esto también significa que las variables de entrada deben leerse antes de pasar el contexto al método de licencia o biblioteca.
-
Reference the Licensing.dll library into your .Activities project and add the using statement:

using UiPath.Marketplace.License.Validations; -
The setup is complete - build your package, and make sure that the Licensing.dll library is present inside the package contents (within the lib folder). Afterward, you can submit it on the Marketplace.
In case your package was not developed using the UiPath Activity Creator
Si su actividad inicial se ve así:
using System;
using System.Activities;
using System.ComponentModel;
namespace ClassMathCustomActivity
{
public class SimpleFormula : CodeActivity
{
[Category("Input")]
[RequiredArgument]
public InArgument<double> FirstNumber { get; set; }
[Category("Input")]
public InArgument<double> SecondNumber { get; set; }
[Category("Output")]
public OutArgument<double> ResultNumber { get; set; }
protected override void Execute(CodeActivityContext context)
{
var firstNumber = FirstNumber.Get(context);
var secondNumber = SecondNumber.Get(context);
var result = System.Math.Pow(firstNumber + secondNumber, 2);
ResultNumber.Set(context, result);
}
}
}
using System;
using System.Activities;
using System.ComponentModel;
namespace ClassMathCustomActivity
{
public class SimpleFormula : CodeActivity
{
[Category("Input")]
[RequiredArgument]
public InArgument<double> FirstNumber { get; set; }
[Category("Input")]
public InArgument<double> SecondNumber { get; set; }
[Category("Output")]
public OutArgument<double> ResultNumber { get; set; }
protected override void Execute(CodeActivityContext context)
{
var firstNumber = FirstNumber.Get(context);
var secondNumber = SecondNumber.Get(context);
var result = System.Math.Pow(firstNumber + secondNumber, 2);
ResultNumber.Set(context, result);
}
}
}
The most important change that you need to make is to the execute method, which needs to be an ExecuteAsync.
The proposed solution is to create AsyncTaskCodeActivity.cs class that should look like this:
using System;
using System.Activities;
using System.Runtime.ExceptionServices;
using System.Threading;
using System.Threading.Tasks;
namespace ClassMathCustomActivity
{
internal struct AsyncTaskCodeActivityImplementation : IDisposable
{
private CancellationTokenSource _cancellationTokenSource;
private bool _tokenDisposed;
public void Cancel()
{
if (!_tokenDisposed)
{
_cancellationTokenSource?.Cancel();
_cancellationTokenSource?.Dispose();
_tokenDisposed = true;
}
}
public IAsyncResult BeginExecute(AsyncCodeActivityContext context
, Func<AsyncCodeActivityContext, CancellationToken, Task<Action<AsyncCodeActivityContext>>> onExecute
, AsyncCallback callback, object state)
{
if (!_tokenDisposed)
{
_cancellationTokenSource?.Dispose();
}
_cancellationTokenSource = new CancellationTokenSource();
_tokenDisposed = false;
TaskCompletionSource<Action<AsyncCodeActivityContext>> taskCompletionSource = new TaskCompletionSource<Action<AsyncCodeActivityContext>>(state);
Task<Action<AsyncCodeActivityContext>> task = onExecute(context, _cancellationTokenSource.Token);
var cancellationTokenSource = _cancellationTokenSource;
task.ContinueWith(t =>
{
if (t.IsFaulted)
{
taskCompletionSource.TrySetException(t.Exception.InnerException);
}
else if (t.IsCanceled || cancellationTokenSource.IsCancellationRequested)
{
taskCompletionSource.TrySetCanceled();
}
else
{
taskCompletionSource.TrySetResult(t.Result);
}
callback?.Invoke(taskCompletionSource.Task);
});
return taskCompletionSource.Task;
}
public void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
Task<Action<AsyncCodeActivityContext>> task = (Task<Action<AsyncCodeActivityContext>>)result;
if (task.IsFaulted)
{
ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
}
if (task.IsCanceled)
{
context.MarkCanceled();
}
task.Result?.Invoke(context);
if (!_tokenDisposed)
{
_cancellationTokenSource?.Dispose();
_tokenDisposed = true;
}
}
private bool _disposed; // To detect redundant calls
public void Dispose()
{
if (!_disposed)
{
if (!_tokenDisposed)
{
if (_cancellationTokenSource != null)
_cancellationTokenSource.Dispose();
_tokenDisposed = true;
}
_disposed = true;
}
}
}
public abstract class AsyncTaskCodeActivity : AsyncCodeActivity, IDisposable
{
private AsyncTaskCodeActivityImplementation _impl = new AsyncTaskCodeActivityImplementation();
protected override void Cancel(AsyncCodeActivityContext context)
{
_impl.Cancel();
base.Cancel(context);
}
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
return _impl.BeginExecute(context, ExecuteAsync, callback, state);
}
protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
_impl.EndExecute(context, result);
}
protected abstract Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken);
#region IDisposable Support
private bool _disposed = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
}
_impl.Dispose(); //structs are not garbage collected so they fit in the unmanaged bucket
_disposed = true;
}
}
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
public abstract class AsyncTaskCodeActivity<T> : AsyncCodeActivity<T>, IDisposable
{
private AsyncTaskCodeActivityImplementation _impl = new AsyncTaskCodeActivityImplementation();
protected override void Cancel(AsyncCodeActivityContext context)
{
_impl.Cancel();
base.Cancel(context);
}
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
return _impl.BeginExecute(context, ExecuteAsync, callback, state);
}
protected override T EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
_impl.EndExecute(context, result);
return Result.Get(context);
}
protected abstract Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken);
#region IDisposable Support
private bool _disposed = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
}
_impl.Dispose(); //structs are not garbage collected so they fit in the unmanaged bucket
_disposed = true;
}
}
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
}
using System;
using System.Activities;
using System.Runtime.ExceptionServices;
using System.Threading;
using System.Threading.Tasks;
namespace ClassMathCustomActivity
{
internal struct AsyncTaskCodeActivityImplementation : IDisposable
{
private CancellationTokenSource _cancellationTokenSource;
private bool _tokenDisposed;
public void Cancel()
{
if (!_tokenDisposed)
{
_cancellationTokenSource?.Cancel();
_cancellationTokenSource?.Dispose();
_tokenDisposed = true;
}
}
public IAsyncResult BeginExecute(AsyncCodeActivityContext context
, Func<AsyncCodeActivityContext, CancellationToken, Task<Action<AsyncCodeActivityContext>>> onExecute
, AsyncCallback callback, object state)
{
if (!_tokenDisposed)
{
_cancellationTokenSource?.Dispose();
}
_cancellationTokenSource = new CancellationTokenSource();
_tokenDisposed = false;
TaskCompletionSource<Action<AsyncCodeActivityContext>> taskCompletionSource = new TaskCompletionSource<Action<AsyncCodeActivityContext>>(state);
Task<Action<AsyncCodeActivityContext>> task = onExecute(context, _cancellationTokenSource.Token);
var cancellationTokenSource = _cancellationTokenSource;
task.ContinueWith(t =>
{
if (t.IsFaulted)
{
taskCompletionSource.TrySetException(t.Exception.InnerException);
}
else if (t.IsCanceled || cancellationTokenSource.IsCancellationRequested)
{
taskCompletionSource.TrySetCanceled();
}
else
{
taskCompletionSource.TrySetResult(t.Result);
}
callback?.Invoke(taskCompletionSource.Task);
});
return taskCompletionSource.Task;
}
public void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
Task<Action<AsyncCodeActivityContext>> task = (Task<Action<AsyncCodeActivityContext>>)result;
if (task.IsFaulted)
{
ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
}
if (task.IsCanceled)
{
context.MarkCanceled();
}
task.Result?.Invoke(context);
if (!_tokenDisposed)
{
_cancellationTokenSource?.Dispose();
_tokenDisposed = true;
}
}
private bool _disposed; // To detect redundant calls
public void Dispose()
{
if (!_disposed)
{
if (!_tokenDisposed)
{
if (_cancellationTokenSource != null)
_cancellationTokenSource.Dispose();
_tokenDisposed = true;
}
_disposed = true;
}
}
}
public abstract class AsyncTaskCodeActivity : AsyncCodeActivity, IDisposable
{
private AsyncTaskCodeActivityImplementation _impl = new AsyncTaskCodeActivityImplementation();
protected override void Cancel(AsyncCodeActivityContext context)
{
_impl.Cancel();
base.Cancel(context);
}
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
return _impl.BeginExecute(context, ExecuteAsync, callback, state);
}
protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
_impl.EndExecute(context, result);
}
protected abstract Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken);
#region IDisposable Support
private bool _disposed = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
}
_impl.Dispose(); //structs are not garbage collected so they fit in the unmanaged bucket
_disposed = true;
}
}
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
public abstract class AsyncTaskCodeActivity<T> : AsyncCodeActivity<T>, IDisposable
{
private AsyncTaskCodeActivityImplementation _impl = new AsyncTaskCodeActivityImplementation();
protected override void Cancel(AsyncCodeActivityContext context)
{
_impl.Cancel();
base.Cancel(context);
}
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
return _impl.BeginExecute(context, ExecuteAsync, callback, state);
}
protected override T EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
_impl.EndExecute(context, result);
return Result.Get(context);
}
protected abstract Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken);
#region IDisposable Support
private bool _disposed = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
}
_impl.Dispose(); //structs are not garbage collected so they fit in the unmanaged bucket
_disposed = true;
}
}
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
}
La actividad modificada debería tener este aspecto:
using System;
using System.Threading.Tasks;
using UiPath.Marketplace.License.Validations;
using System.ComponentModel;
using System.Activities;
using System.Threading;
namespace ClassMathCustomActivity
{
public class SimpleFormula : AsyncTaskCodeActivity
{
[Category("Input")]
[RequiredArgument]
public InArgument<double> FirstNumber { get; set; }
[Category("Input")]
public InArgument<double> SecondNumber { get; set; }
[Category("Output")]
public OutArgument<double> ResultNumber { get; set; }
protected override async Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken)
{
var firstNumber = FirstNumber.Get(context);
var secondNumber = SecondNumber.Get(context);
// check for license after reading input arguments
#if !DEBUG
//if your package is MyCompany.MyPackageName.Activities.1.0.0.nupkg
await Validator.ValidateAsync(context, "MyCompany.MyPackageName.Activities");
#endif
return (ctx) =>
{
var result = System.Math.Pow(firstNumber + secondNumber, 2);
ResultNumber.Set(ctx, result);
};
}
}
}
using System;
using System.Threading.Tasks;
using UiPath.Marketplace.License.Validations;
using System.ComponentModel;
using System.Activities;
using System.Threading;
namespace ClassMathCustomActivity
{
public class SimpleFormula : AsyncTaskCodeActivity
{
[Category("Input")]
[RequiredArgument]
public InArgument<double> FirstNumber { get; set; }
[Category("Input")]
public InArgument<double> SecondNumber { get; set; }
[Category("Output")]
public OutArgument<double> ResultNumber { get; set; }
protected override async Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken)
{
var firstNumber = FirstNumber.Get(context);
var secondNumber = SecondNumber.Get(context);
// check for license after reading input arguments
#if !DEBUG
//if your package is MyCompany.MyPackageName.Activities.1.0.0.nupkg
await Validator.ValidateAsync(context, "MyCompany.MyPackageName.Activities");
#endif
return (ctx) =>
{
var result = System.Math.Pow(firstNumber + secondNumber, 2);
ResultNumber.Set(ctx, result);
};
}
}
}
Es importante que la línea 24 se ejecute justo después de leer todos los argumentos de entrada. En el ejemplo anterior, las líneas 20 y 21 se usan para leer los argumentos de entrada, y las líneas 26 a 30 se usan para configurar el argumento de salida.
One last thing - when creating your .nupkg package, please make sure that the Licensing.dll library is present inside the package contents (within the lib folder).
Preguntas frecuentes
¿Qué sucede después de implementar estos cambios?
After you have implemented the changes and built the.nupkg, you need to submit it to the Marketplace for publishing.
¿Puedo obtener el archivo de licencia para fines de prueba?
No, para probar las actividades, puede usar la directiva del preprocesador de C # para la depuración (#if !DEBUG)
¿Cómo obtendrán los clientes el archivo de licencia?
After someone made a purchase, a license .lic file will be generated and made available for them on the Marketplace. They will be able to download the file and then follow the necessary steps for using the activities.