---
title: "Create a custom codeunit with expression functions using the Invokable0 to Invokable10 interface"
slug: "create-custom-codeunit-expression-functions-using-invokable0-to-invokable10-inte"
tags: ["BC", "BIS", "Business Central", "Business Integration Solutions", "Task"]
updated: 2026-06-25T09:59:07Z
published: 2026-06-25T09:59:07Z
canonical: "docs.staedean.com/create-custom-codeunit-expression-functions-using-invokable0-to-invokable10-inte"
---
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.staedean.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create a custom codeunit with expression functions using the Invokable0 to Invokable10 interface
## Steps
This scenario is based on a single codeunit holding a single `Invoke` method with a possible number of arguments from zero up to 10. Create your own `InvokableN` extension based on how many arguments your library needs. The example below shows an enum extension for libraries that need three arguments. Do the same for other invokables if needed.
```plaintext
enumextension 50000 "My Invokable 3 Enum Ext" extends TICInvokable3
{
value(50000; "My custom invokable 3 library")
{
Implementation = TICIInvokeRegistrable = "My custom invokable 3 library", TICIInvokable3 = "My custom invokable 3 library";
}
}
```
Your codeunit must implement both interfaces: `TICIInvokableN` and `TICIInvokeRegistrable`.
The `TICIInvokableN` interface gives you access to the `Invoke` method that each interface has:
```plaintext
// Invokable0 Invoke
procedure Invoke(var return: Variant)
// Invokable1 Invoke
procedure Invoke(var return: Variant; arg1: Variant)
// Invokable2 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant)
// Invokable3 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant)
// Invokable4 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant)
// Invokable5 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant; arg5: Variant)
// Invokable6 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant; arg5: Variant; arg6: Variant)
// Invokable7 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant; arg5: Variant; arg6: Variant; arg7: Variant)
// Invokable8 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant; arg5: Variant; arg6: Variant; arg7: Variant; arg8: Variant)
// Invokable9 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant; arg5: Variant; arg6: Variant; arg7: Variant; arg8: Variant; arg9: Variant)
// Invokable10 Invoke
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant; arg4: Variant; arg5: Variant; arg6: Variant; arg7: Variant; arg8: Variant; arg9: Variant; arg10: Variant)
```
The `TICIInvokeRegistrable` interface exposes the `RegisterInvokableMethods` method, where you register the functions to make available:
```plaintext
// Library that exposes ways of registering methods and arguments
procedure RegisterInvokableMethods(var Registrar: Codeunit TICInvokableRegistrar);
// The method name to register
// The method description to register
// The method return type
// The enum value linked to the codeunit library to register
procedure RegisterMethod(MethodName: Text[245]; MethodDescription: Text[150]; ReturnType: Enum TICInvokableReturnType; Namespace: Enum TICNSInvokable)
// The argument name to register
// The argument type to register
procedure AddArguments(ArgName: Text[120]; ArgType: Enum TICInvokableParameterType)
// The method name to look up
// The namespace to look up
// The var variables fill with the method metadata based on the method name and namespace
procedure GetMethodMetadata(MethodName: Text[245]; Namespace: Text; var MethodDescription: Text[150]; var ReturnType: Enum TICInvokableReturnType; var ArgumentsList: Codeunit TICInvokableMethodParamColl): Boolean
```
## Example
A full example of an InvokableN library:
```plaintext
codeunit 50000 "My Invokable3 Library" implements TICIInvokeRegistrable, TICIInvokable3
{
procedure Invoke(var return: Variant; arg1: Variant; arg2: Variant; arg3: Variant)
var
ArgInt: Integer;
ArgDec: Decimal;
begin
ArgInt := arg1;
ArgDec := arg2;
ArgDec := Round(ArgDec);
return := Format(arg3) + Format(ArgInt / ArgDec);
end;
procedure RegisterInvokableMethods(var Registrar: Codeunit TICInvokableRegistrar)
var
ReturnType: Enum TICInvokableReturnType;
ParameterType: Enum TICInvokableParameterType;
begin
Registrar.RegisterMethod('Invoke', 'Invokable 3 method description.', ReturnType::Text);
Registrar.AddArguments('arg1', ParameterType::Integer);
Registrar.AddArguments('arg2', ParameterType::Decimal);
Registrar.AddArguments('arg3', ParameterType::Decimal);
end;
}
```
## Related
- [Create a custom codeunit with expression functions using the Namespaced Invokable interface](/bc-create-custom-codeunit-expression-functions-namespaced-invokable-interface.md)
- [Expose functions to the Function interface](/bc-expose-functions-to-the-function-interface.md)