OTX-Runtime for DotNet  
Migration 6.x to 7.x

The OTX-Runtime API 7.x is a complete new implementation based at C++. It is independent from the former OTX-Runtime API 6.x (DotNet, Java). Applications which based at the OTX-Runtime API 6.x can be migrate to the OTX-Runtime API 7.x. The picture shows the main structure of the OTX-Runtime API 7.x.

Main Differences

The main differences between OTX-Runtime API 6.x and 7.x are listed in the following table.

Feature 6.x 7.x Description
OTX Runner Own process Own process or inside application process OTX Runner is the process where the OTX logic will be executed
IPC Between Runner and API Sockets Sockets, Pipe or Raw IPC means inter process communication. Raw do not need IPC.
Diagnostic Runtime System (MVCI) Inside Runner Outside Runner inside OTX-DiagManager API DiagManager can be run inside its own process and is stand-alone usable
IPC Between Runner and DiagManager - Sockets, Pipe or Raw IPC means inter process communication. Raw do not need IPC.
Configuration and start Diagnostic Runtime System Implicit inside Runner Explicit with DiagManager IPC means inter process communication. Raw do not need IPC.
Implementations for access to external systems Implicit inside Runner Explicit outside Runner inside so called Custom Implementations CustomImplementations can be changed by the user. A default custom implementation with the same functionality like in 6.x will delivered together with the OTX-Runtime API. Some custom implementations, e.g. DefaultCustomScreenImplementation must be set explicitly, see example below.
API entry point RuntimeManager RuntimeManagerFactory and IRuntimeManager The main structures of the APIs are very similar

7.x Sample Code

The basic proceeding how the OTX-Runtime API 7.x can be used is described in the following pseudo code example. The example executes the main procedure of a PTX file.

// Generally applicable Pseudo-Code example
// ========================================
// Please note that the exact syntax of C++, DotNet and Java is different!
void main()
// Release the license manager
// ===========================
// Create the RuntimeManager and connect it to DiagManager
// =======================================================
// Creates the RuntimeManager at automatic selected port connected with DiagManager at port 8888
// Please note that the DiagManager must be started, e.g. via DiagManagerSample.exe!
OpenTestSystem.Otx.Runtime.Api.IRuntimeManager runtimeManager = null;
// Create callbacks for RuntimeManager events
// ==========================================
runtimeManager.OnProcedureStarted += ProcedureStartedHandler(ProcedureStarted);
runtimeManager.OnProcedureFinished += ProcedureFinishedHandler(ProcedureFinished);
runtimeManager.OnProcedureStopped += ProcedureStoppedHandler(ProcedureStopped);
runtimeManager.OnProcedureAborted += ProcedureAbortedHandler(ProcedureAborted);
// Set trace folder and level
RuntimeConfig.Instance.TraceFolder = "C://");
RuntimeConfig.Instance.TraceLevel = TraceLevels.All;
// Set CustomScreen implementations
// ================================
// Create custom implementation and set to the RuntimeManager
CustomScreenImplementation customScreenImplementation = new CustomScreenImplementation();
// Load PTX file and browse OTX data structure
// ===========================================
OpenTestSystem.Otx.Runtime.Api.Project.IProject project = runtimeManager.LoadPtx("C:\\HelloWorldSample1.ptx");
OpenTestSystem.Otx.Runtime.Api.Otx.IProcedure procedure = project.MainProcedure;
if (procedure != null)
if (procedure.Parameters.Size > 0)
// Assume the first parameter is an InParameter of data type String
OpenTestSystem.Otx.Runtime.Api.Otx.IProcedureParameter parameter = procedure.Parameters[0];
if (parameter.DataType == "String" && parameter is OpenTestSystem.Otx.Runtime.Api.Otx.IProcedureInParameter)
// Executes the procedure synchronous
// ==================================
OpenTestSystem.Otx.Runtime.Api.IRuntimeContext runtimeContext = runtimeManager.Execute(procedure);
if (runtimeContext.IsFinished)
// Procedure finished successfully
else if (runtimeContext.IsStopped)
// Procedure was stopped by the user
else if (runtimeContext.HasRuntimeException)
// Procedure was terminated by a runtime exception
else if (runtimeContext.HasOtxException)
// Procedure was terminated by an OTX exception
// Procedure was finished by another reason
Class to manage the OTX-Runtime API licenses
Definition: LicenseManager.cs:12
static void SetLicenseKey(string licenseKey)
Sets a valid license key to release the API.
Definition: LicenseManager.cs:24
Factory class for creating runtime managers, see IRuntimeManager
Definition: RuntimeManagerFactory.cs:16
static IRuntimeManager CreateSocketRuntimeManager(ushort otxRunnerPort)
Creates SocketRuntimeManager without DiagManager.
Definition: RuntimeManagerFactory.cs:34
Contains information of a Runner instance.
Definition: IRuntimeContext.cs:15
Main class to load and execute an OTX project
Definition: IRuntimeManager.cs:30
Represents an OTX Procedure.
Definition: IProcedure.cs:8
Represents class for InParameter of a Procedure. The parameter is identical to a related parameter in...
Definition: IProcedureInParameter.cs:8
Represents base class for InParameter, OutParameter and InOutParameter of a Procedure....
Definition: IProcedureParameter.cs:8
object Value
Gets Parameter value.
Definition: IProcedureParameter.cs:32
The Project is the root element of the OTX Data Structure. It mainly contains the Packages and the Pr...
Definition: IProject.cs:15
delegate void ProcedureStoppedHandler(IRuntimeContext context)
Represents the method that will handle the ProcedureStopped event raised when execution stopped.
delegate void ProcedureStartedHandler(IRuntimeContext context)
Represents the method that will handle the ProcedureStarted event raised when the procedure started.
delegate void ProcedureFinishedHandler(IRuntimeContext context)
Represents the method that will handle the ProcedureFinished event raised when a procedure completed ...
delegate void ProcedureAbortedHandler(IRuntimeContext context)
Represents the method that will handle the ProcedureAborted event raised when a procedure aborted run...
Namespace containing all objects related to licensing
Definition: IpcLicenseCheckerBase.cs:10
Namespace for browsing at OTX data structure.
Definition: IContextVariable.cs:5
Namespace containing main entries: IProject and IPlayerProject.
Definition: IPlayerProject.cs:5
Namespace containing the programming interface for browsing and execution of OTX procedures in own ap...
Definition: ApiConstants.cs:5
Namespace containing all objects for browsing and execution of OTX procedures
Definition: ApiConstants.cs:5
Namespace containing all objects which are standardized according to ISO 13209 (OTX)
Namespace containing all objects related to testing inside automotive industry

OTX file related to the examples above.

<?xml version="1.0" encoding="utf-8"?>
<otx xmlns="http://iso.org/OTX/1.0.0" xmlns:hmi="http://iso.org/OTX/1.0.0/HMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="id_0a4aa7adb9484acd80fd9b8cc0889d1c" name="HelloWorldSampleDocument" package="HelloWorldSample1Package1" version="" timestamp="2020-04-30T15:12:52.8454075+02:00">
<data key="MadeWith">Created by emotive Open Test Framework - www.emotive.de</data>
<data key="OtfVersion"></data>
<procedure id="id_9fd318a128cd4945aa7ed8d5cd57c0b8" name="main" visibility="PUBLIC">
<inParam name="Message" id="InParameterDeclaration_9d68143af6864f9b89691051826e9f9a">
<dataType xsi:type="String" />
<action name="ConfirmDialog1" id="ConfirmDialog_9f6feabe81034ffab0d6113e65df827f">
<realisation xsi:type="hmi:ConfirmDialog">
<hmi:title xsi:type="StringLiteral" value="Hello World" />
<hmi:message xsi:type="StringValue" valueOf="Message" />