studio
2024.10
false
- Release Notes
- Getting Started
- Setup and Configuration
- Automation Projects
- Dependencies
- Types of Workflows
- Control Flow
- File Comparison
- Automation Best Practices
- Source Control Integration
- Debugging
- Logging
- The Diagnostic Tool
- Workflow Analyzer
- About Workflow Analyzer
- ST-NMG-001 - Variables Naming Convention
- ST-NMG-002 - Arguments Naming Convention
- ST-NMG-004 - Display Name Duplication
- ST-NMG-005 - Variable Overrides Variable
- ST-NMG-006 - Variable Overrides Argument
- ST-NMG-008 - Variable Length Exceeded
- ST-NMG-009 - Prefix Datatable Variables
- ST-NMG-011 - Prefix Datatable Arguments
- ST-NMG-012 - Argument Default Values
- ST-NMG-016 - Argument Length Exceeded
- ST-NMG-017 - Class name matches default namespace
- ST-DBP-002 - High Arguments Count
- ST-DBP-003 - Empty Catch Block
- ST-DBP-007 - Multiple Flowchart Layers
- ST-DPB-010 - Multiple instances of [Workflow] or [Test Case]
- ST-DBP-020 - Undefined Output Properties
- ST-DBP-021 - Hardcoded Timeout
- ST-DBP-023 - Empty Workflow
- ST-DBP-024 - Persistence Activity Check
- ST-DBP-025 - Variables Serialization Prerequisite
- ST-DBP-026 - Delay Activity Usage
- ST-DBP-027 - Persistence Best Practice
- ST-DBP-028 - Arguments Serialization Prerequisite
- ST-USG-005 - Hardcoded Activity Arguments
- ST-USG-009 - Unused Variables
- ST-USG-010 - Unused Dependencies
- ST-USG-014 - Package Restrictions
- ST-USG-017 - Invalid parameter modifier
- ST-USG-020 - Minimum Log Messages
- ST-USG-024 - Unused Saved for Later
- ST-USG-025 - Saved Value Misuse
- ST-USG-026 - Activity Restrictions
- ST-USG-027 - Required Packages
- ST-USG-028 - Restrict Invoke File Templates
- ST-USG-032 - Required Tags
- ST-USG-034 - Automation Hub URL
- Variables
- Arguments
- Imported Namespaces
- Coded automations
- Introduction
- Registering custom services
- Before and After contexts
- Generating code
- Generating coded test case from manual test cases
- Trigger-based Attended Automation
- Recording
- UI Elements
- Selectors
- Object Repository
- Data Scraping
- Image and Text Automation
- Citrix Technologies Automation
- RDP Automation
- VMware Horizon Automation
- Salesforce Automation
- SAP Automation
- macOS UI Automation
- The ScreenScrapeJavaSupport Tool
- The WebDriver Protocol
- Extensions
- About extensions
- SetupExtensions tool
- UiPathRemoteRuntime.exe is not running in the remote session
- UiPath Remote Runtime blocks Citrix session from being closed
- UiPath Remote Runtime causes memory leak
- UiPath.UIAutomation.Activities package and UiPath Remote Runtime versions mismatch
- The required UiPath extension is not installed on the remote machine
- Screen resolution settings
- Group Policies
- Cannot communicate with the browser
- Chrome extension is removed automatically
- The extension may have been corrupted
- Check if the extension for Chrome is installed and enabled
- Check if ChromeNativeMessaging.exe is running
- Check if ComSpec variable is defined correctly
- Enable access to file URLs and Incognito mode
- Multiple browser profiles
- Group Policy conflict
- Known issues specific to MV3 extensions
- List of extensions for Chrome
- Chrome Extension on Mac
- Group Policies
- Cannot communicate with the browser
- Edge extension is removed automatically
- The extension may have been corrupted
- Check if the Extension for Microsoft Edge is installed and enabled
- Check if ChromeNativeMessaging.exe is running
- Check if ComSpec variable is defined correctly
- Enable access to file URLs and InPrivate mode
- Multiple browser profiles
- Group Policy conflict
- Known issues specific to MV3 extensions
- List of extensions for Edge
- Extension for Safari
- Extension for VMware Horizon
- Extension for Amazon WorkSpaces
- SAP Solution Manager plugin
- Excel Add-in
- Studio testing
- Troubleshooting
- About troubleshooting
- Assembly compilation errors
- Microsoft App-V support and limitations
- Internet Explorer X64 troubleshooting
- Microsoft Office issues
- Identifying UI elements in PDF with Accessibility options
- Repairing Active Accessibility support
- Validation of large Windows-legacy projects takes longer than expected

Studio User Guide
Last updated Sep 3, 2025
Registering custom services
linkTo enhance your coded automations, consider registering custom services. By registering a custom service, you can use it globally
in your project. This way, it's accessible not only in a single coded automation, but in all coded automations within your
project.
- Create a code source file and define a public interface named as the service you wish to create.This interface should list the methods you intend to use with your custom service. Each method must be implemented in a separate class which inherits the same file where you're defining the interface.For this example, name the interface as
IMyService
and call the method inside itDoMyMethod
.{ public interface IMyService { void DoMyMethod(); } }
{ public interface IMyService { void DoMyMethod(); } } - Proceed to another code source file and implement the methods from the previously created interface.This class must inherit from the same code source file where the public interface was created.In this example, implement the
DoMyMethod
method to output the value of a variable.public class MyService : IMyService { public void DoMyMethod() { var a = "hello world"; Console.WriteLine(a); } } }
public class MyService : IMyService { public void DoMyMethod() { var a = "hello world"; Console.WriteLine(a); } } } - Build a partial class to wrap your custom service, making it accessible from any coded workflow that inherits this class.
- Create another code source file and declare the public partial class named
Coded Workflow
. Make this class inherit theCodedWorkflowBase
class. - Create a get-only property for the custom service you created, which allows access to an instance of the service interface.The instance is obtained through dependency injection using the
serviceContainer.Resolve<IMyService>()
method. This provides a way to interact with the custom service within the partial class.public IMyService myService { get => serviceContainer.Resolve<IMyService>()};
public IMyService myService { get => serviceContainer.Resolve<IMyService>()}; - Expand your class further by adding the
RegisterServices
method.By invoking this method, you register your custom service within the UiPath service container.protected override void RegisterServices(ICodedWorkflowsServiceLocator serviceLocator) { serviceLocator.RegisterType<IMyService, MyService>(); }
protected override void RegisterServices(ICodedWorkflowsServiceLocator serviceLocator) { serviceLocator.RegisterType<IMyService, MyService>(); }You can also useRegisterInstance
instead ofRegisterType
. Check the following differences between the two implementations, and their signature methods:RegisterType
- When you useRegisterType
, you specify the container to create a new copy or instance of your service each time you call it.RegisterType
gives a blueprint to follow, based on which to build a new service each time.TService
: This is the service interface type that will be consumed by the service. It's the interface that you create for your service. For this example, it'sIMyService
.TServiceImplementation
: This is the class that implements theTService
interface. It's the class that is created when a service of typeTService
is requested.registrationType
: This defaults toCodeServiceRegistrationType.Singleton
. It sets the service registration policy.
void RegisterType<TService, TServiceImplementation>(CodeServiceRegistrationType registrationType = CodeServiceRegistrationType.Singleton) where TService : class where TServiceImplementation : class, TService;
void RegisterType<TService, TServiceImplementation>(CodeServiceRegistrationType registrationType = CodeServiceRegistrationType.Singleton) where TService : class where TServiceImplementation : class, TService;RegisterInstance
- When you useRegisterInstance
, you offer the container a ready-made instance of that service, that you already created before. Every time you call the service, the container returns this exact pre-made service.RegisterInstance
returns an exact copy of the service that you created.TServiceImplementation
: This is the ready-made instance of a class that you have already created. This instance is returned whenever a service of this type needs to be resolved. For this example,MySecondService
.serviceTypes
: This is an array of types that the instance will be available as, when calling it.
void RegisterInstance<TServiceImplementation>(TServiceImplementation instance, params Type[] serviceTypes) where TServiceImplementation : class;
void RegisterInstance<TServiceImplementation>(TServiceImplementation instance, params Type[] serviceTypes) where TServiceImplementation : class;
The code snippet below shows an example of how the public partial class was implemented:public partial class CodedWorkflow : CodedWorkflowBase { public IMyService myService { get => serviceContainer.Resolve<IMyService>() ; } protected override void RegisterServices(ICodedWorkflowsServiceLocator serviceLocator) { // Implementation using 'RegisterType' serviceLocator.RegisterType<IMyService, MyService>(); // Implementation using 'RegisterInstance' var secondService = new MySecondService(); serviceLocator.RegisterInstance<MySecondService>(secondService); }
public partial class CodedWorkflow : CodedWorkflowBase { public IMyService myService { get => serviceContainer.Resolve<IMyService>() ; } protected override void RegisterServices(ICodedWorkflowsServiceLocator serviceLocator) { // Implementation using 'RegisterType' serviceLocator.RegisterType<IMyService, MyService>(); // Implementation using 'RegisterInstance' var secondService = new MySecondService(); serviceLocator.RegisterInstance<MySecondService>(secondService); } - Create another code source file and declare the public partial class named
Next steps
linkTo use the custom service that you created, reference the namespace of that service within the file you are working on, by
employing the
using
statement. The namespace of the custom service represents the name of the project, and the name of the folders/subfolders
that the .cs
file might be in. The format of the namespace is the following: <ProjectName>.<Folder>.<SubFolder>
For example, if you create a custom service inside a project that is named
GeneralCustomServices
, within the MyCustomService
folder, then the namespace of that service is: GeneralCustomServices.MyCustomService
.