What's new in QuickOPC 2022.1

From OPC Labs Knowledge Base
Jump to navigation Jump to search
See also: Versions; Previous version: What's new in QuickOPC 2021.3

Internal version number: 5.63

Key changes:

  • Initial support for .NET 6.0
  • COM management updates


  • .NET 6.0 is now a supported .NET runtime. Note: When you develop for .NET 6, use .NET Standard 2.1 as target framework. Windows-specific technologies (Windows Forms, WPF) and features that depend on them (Live Binding, Browse Dialogs and Browse Controls, ...) are not yet supported.
  • Maximum supported Windows 10 version is now 21H2.


  • The default format of the distributed license key file is now .TXT (Base64 encoded), instead of .BIN. This is intended to prevent issues with mail/antivirus filters which sometimes reject to let through binary files. License Manager accepts the .TXT format since version 2018.2.
  • COM development now requires Enterprise Edition or higher (previously, it required Professional Edition or higher). This is valid for license keys issued from the release date of software version 2022.1. Behavior of license keys issued earlier is not affected, even with software version 2022.1 or later. Note: "COM development" means using the toolkit from COM-based development tools (such as VB6, Delphi, PHP etc.); it does *not* refer to the usage of COM/DCOM-based OPC specification (OPC Classic), this aspect remains unchanged.
  • Licenses from the registry (Registry License Store, i.e. those handled by the License Manager utility) are now recognized when running under .NET Core/.NET 5+ on Windows (previously, they were only recognized when you were targeting .NET Framework).
  • Added LicensingManagement.RegisterManagedResourceWithExistenceCheck method. In comparison with the preexisting LicensingManagement.RegisterManagedResource method, this new method checks upfront whether the specified license resource exists, and throws an exception if it does not exist or is not accessible. This allows easier troubleshooting of the process of embedding the license key into your project.

Component Improvements

OPC Classic

  • Added ComSecurityParameters.EnsureDataIntegrity property (defaults to false). You can set this property in ComManagement.Instance.Configuration.SecurityParameters. When true (and ComSecurityParameters.UseCustomSecurity is also true, which is the default), it sets the security so that COM verifies that none of the data transferred between client and server has been modified, by specifying RPC_C_AUTHN_LEVEL_PKT_INTEGRITY for the authentication level. Using this authentication level might be necessary on systems with hardening changes for CVE-2021-26414 vulnerability. For related guidance, see COM management.
  • It is possible to enforce early initialization of COM security by calling ComManagement.Instance.AssureSecurityInitialization(). The ComManagement.Instance.AssureSecurityInitializationAndRunOnStaThread method makes it easier to rewrite programs that were originally written to start on an STA thread, but had to be switched to an MTA thread in order to avoid premature COM security initialization.
  • Added ComSecurityParameters.AllowImpersonateClient property (defaults to false). Controls whether the the server is allowed to impersonate the client.
  • COM security initialization success or failure is now logged through the EasyDAClient.LogEntry or EasyAEClient.LogEntry events.
  • COM security initialization success or failure events are now written to the system log. This can be turned on/off by the ComManagement.Instance.LogToSystem property.
  • COM configuration can now be set externally to the program, using Intrinsic Component Configuration.
  • The DANodeDescriptor and AENodeDescriptor classes have been extended by a BrowsePathStartingNodeDescriptor property. This allows to specify a node other than the root node as a starting node for the browse path.
  • Added HasBrowsePath and HasNodeId properties to the DANodeDescriptor and AENodeDescriptor classes.
  • Added HasClsid and HasProgId properties to the ObjectDescriptor and ServerDescriptor classes.
  • The native OPC DA and A&E clients no longer attempt to connect to remote registry and/or OPCEnum, if the server descriptor specifies a CLSID. This can reduce the time needed to connect to the OPC server.
  • Added "ProgID Database" optimization to the OPC DA Optimizer. It recognizes ProgIDs of some common OPC servers, and resolves them directly to CLSIDs, bypassing the need to search through registry or use OPCEnum. This results in faster connection times, especially in remote scenarios with slow network connections. It can also allow connection to an OPC server that would otherwise be unreachable, due to ProgID resolution issues.
  • Added OPC A&E Optimizer plugin, with the ProgID database optimization (same functionality as described for OPC DA).
  • Enhanced error messages.

OPC UA Client-Server

  • Added StartingNodeDescriptor property to the UABrowsePath. This is a generalization of the existing StartingNodeId property, allowing the starting node be specified not just by its node ID, but by any node descriptor (which can then contain a browse path, etc., recursively).


  • Added ability to load and resolve PubSub configurations from Web resources, using FTP, HTTP or HTTPS.
  • Added UADataSetData.FieldDataDictionaryById property. When metadata is available, this property contains field data for each field in the dataset, keyed by the dataset field Id (a GUID).
  • Added Origin property to the UADataSetHeader (and therefore also to the derived UADataSetData) class. The property contains origin of the dataset. The type and semantics of the origin depends on the transport used. For example, it is a string containing topic name in MQTT transport. It is an IPEndpoint object in the UDP transport, and a PhysicalAddress object in the Ethernet transport.
  • Replaced the EasyUASubscribeDataSetFieldArguments.FieldName property by a DataSetFieldDescriptor property, which can contain either a field name, or a dataset field Id (a GUID). Also, the various overloads of the IEasyUASubscriberExtension.SubscribeDataSetField method now take the UADataSetFieldDescriptor object as an input, instead of just the field name. Implicit conversions exist from a string (representing the field name) or a GUID (representing the dataset field Id) to the UADataSetFieldDescriptor.
  • Added recognition of cases when a JSON message is being parsed as UADP, or vice versa, and generate specific errors with messages properly identifying the cause of the problem.
  • In JSON message mapping, added support for DataSetWriterName and ReversibleFieldEncoding flags, introduced in OPC UA specification 1.05.01.

COM Components

  • Updated QuickOpc.h include file (Microsoft C++) for use with ISO C++ 20 Standard.


  • Added the IEasyUAClientConnectionControl service on the EasyUAClient component (Professional Edition and higher). It provides methods to control the OPC UA client connections to the server, and contains methods like LockConnection and UnlockConnection. When the connection is locked, the component will attempt to open it and keep open, and will not automatically disconnect from the server after the connection is unused for certain time. The service is also available via COM, as _EasyUAClientConnectionControl interface. In .NET, it is also possible to use the DisposableLockConnection extension method, which works nicely with "using" statements in C# and VB.NET.
  • Added the IEasyUAClientNodeRegistration service on the EasyUAClient component (Professional Edition and higher). It provides methods to register and unregister nodes, using the corresponding OPC UA services. Node registration (with OPC UA servers that support it) can improve performance with repeatedly accessed nodes. The service is also available via COM, as _EasyUAClientNodeRegistration interface.

Component Refactorings

OPC Classic

  • The ServerClass property (in ObjectDescriptor, ServerDescriptor, and OpcServerDialog classes) now contains the {CLSID} of the OPC server, if available; otherwise, it contains its ProgID (or is empty, if no ProgID present either). Previously, the ServerClass property "preferred" the ProgID before the CLSID. This is potentially a breaking change. If you need the previous behavior, use the new ServerProgram property instead.
  • Properties ExecutionContext and TurnOffActivationSecurity have from EasyMachineParameters (for OPCEnum operations) and EasyClientParameters (for target OPC server operation) have been moved into a new class, ComInstantiationParameters, and a corresponding ComInstantiationParameters property has been added to the EasyMachineParameters and EasyClientParameters classes.
  • The effective COM instantiation parameters are now determined by taking the value from ComManagement.Instance.Configuration.InstantiationParameters, and possibly overriding them by values from EasyXXClient.SharedParameters.ClientParameters.ComInstantiationParameters, or EasyXXClient.SharedParameters.MachineParameters.ComInstantiationParameters.
  • Properties UseCustomSecurity and TurnOffCallSecurity have been moved from EasyMachineParameters (for OPCEnum operations) and EasyClientParameters (for target OPC server operation) and merged into a single set of properties in a new class, ComSecurityParameters, available in the ComManagement.SecurityParameters property.
  • The default timeout values for OPC DA, OPC XML-DA and OPC A&E operation have been increased from 60 seconds to 90 seconds.


  • The ServerConditionChanged event, previously available on the IEasyUAClient interface, has been moved to a new service, IEasyUAClientConnectionMonitoring, available from the EasyUAClient component. The service is also available via COM, as _EasyUAClientConnectionMonitoring interface.
  • Types renamed: UAComplexDataPluginParameters to UAComplexDataClientPluginParameters, _UAComplexDataPluginParameters to _UAComplexDataClientPluginParameters. When retrieving the OPC UA Complex Data plugin (for OPC UA client-server model) setup from EasyUAClient.InstanceParameters.PluginSetups using the FindName method, use "UAComplexDataClient" instead of "UAComplexData".


  • The ResolverDescriptor property has been moved from the UASubscribedataSetArguments class to the UADataSetSubscriptionDescriptor class.

User Interface

  • In OPC UA browse controls and dialogs, when an endpoint configuration has been changed from its initial state (e.g. when the user has modified the user identity, or the endpoint selection policy), the OPC UA endpoint icon now indicates that by showing an additional overlay in the upper left corner.
  • Object editor dialogs now contain a ">>> More" checkbox in the tab header area. When checked, an additional Serialization tab is shown. The Serialization tab shows how to create currently the edited object, including all its configured content, in C# and VB.NET.
  • Added Origin field to the OPC UA PubSub dataset header and dataset data controls.

Tools and Online Services

Connectivity Explorer

  • The Connectivity Explorer now has a node for OPC UA PubSub, and it allows the user to browse the relevant parts of the Publish/Subscribe model in the servers, selected dataset fields form published datasets, and display their values in the Live Point Data view.
  • In various property grids, the property name in the description area is now clickable (underlined), and shows a contextual online help associated with that property. Also, a Help command has been added to the context menu on the property grids.
  • Added Lock Connection action on OPC UA endpoints. It allows the user to lock or unlock the connection to the specified endpoint, assuring that the component will attempt to keep the connection open until unlocked. Endpoints nodes with locked connections are marked with a little "lock" overlay icon.
  • Added a little overlay icon to OPC UA endpoint nodes that are "dirty", i.e. modified from their original state (e.g. their endpoint selection policy, or user identity, has been changed by the user).

Demo Servers and Publishers

OpcCmd Utility

  • Using the new --!inputFile|--!if <fileName> command option, it is now possible to switch the tool input to the specified file.
  • The .opccmd file extension is now associated with executing the file using the OpcCmd utility.
  • Added uaClient getService uaClientConnectivityControl command, with lockConnection and unlockConnection subcommands.
  • Added uaClient getService uaClientNodeRegistration command, with registerNode and unregisterNode subcommands.
  • Added interopServices comManagement command, allowing the user to view and change the COM configuration, and assureSecurityInitialization subcommand.
  • Added --OutputFieldsById|-ofbi option to the uaSubscriber subscribeDataSet command. When used, the fields in the dataset messages are outputted with their dataset field Ids, instead of field names.
  • Added --DataSetFieldId|-dsfi <guid> option to the uaSubscriber subscribeDataSetField command. The option allows to specify the dataset field Id (a GUID) of the field to be subscribed to (as an alternative to specifying the field name), when metadata is available.
  • Added plugins setup command, allowing to access (view and modify) the setup of a specified plugin.
  • More dense output of trace entries, by shortening the trace event type column to a 3-letter symbol.


OPC UA Client-Server

  • Added a C# example showing how to lock and unlock connections to an OPC UA server, using the new IEasyUAClientConnectionControl service.
  • Added a C# example showing how to register an unregister nodes in an OPC UA server, using the new IEasyUAClientNodeRegistration service.
  • Added a VBScript example showing how to connections to and disconnections from the OPC UA server, using the IEasyUAClientConnectionMonitoring service and the event pull mechanism.
  • Added a VB.NET example showing how to store current state of the subscribed items in a dictionary.
  • Added a C# example showing how to obtain "data nodes" under the "Objects" node, recursively.