# Versionshistorie

> Referenz: Alle Releases des OPC UA .NET SDK mit neuen Funktionen, Änderungen und Fehlerbehebungen, gruppiert nach Versionsreihe und Minor-Version.

Die Releases sind nach Versionsreihen und Minor-Versionen gruppiert. Die Releases der aktuellen Version 2.59 sind ausgeklappt, ältere Releases lassen sich einzeln aufklappen.

Welche Änderungen beim Umstieg von einer älteren Version bestehenden Code betreffen, fasst die Seite [Auf neue Version umsteigen](https://www.traeger.de/docs/development/opcua/upgrade) zusammen.

## 2.50–2.59 (2025–2026)

### 2.59

#### 2.59.0.0 (freigegeben am 09.11.2026)

**Neu**
- Neu: `OpcObjectTypes.ServerCapabilitiesType` und `OpcObjectTypes.ServerDiagnosticsType`. Sie bezeichnen die Objekttypen ServerCapabilitiesType und ServerDiagnosticsType und liefern die Bezeichner der zugehörigen Nodes. Bisher waren die Eigenschaften der Klassen `OpcObjectTypes.OpcServerCapabilitiesType` und `OpcObjectTypes.OpcServerDiagnosticsType` nicht erreichbar, weil keine Instanz davon bereitgestellt wurde.
- Neuer Typ `OpcModifiedNodeHistory`. Er speichert die geänderten Werte (`OpcModifiedHistoryValue`) eines Nodes, auch mehrere Änderungen eines Werts mit demselben Zeitstempel. Die Werte sind nach ihrem Zeitstempel sortiert, bei gleichem Zeitstempel von der neuesten zur ältesten Änderung. Ist die Kapazität erreicht, wird die älteste Änderung entfernt.

**Geändert**
- **Bruch:** Die veraltete Abhängigkeit `Portable.BouncyCastle` (Version 1.9.0) ist durch `BouncyCastle.Cryptography` (Version 2.7.0) ersetzt. Deren Assembly heißt `BouncyCastle.Cryptography.dll` statt `BouncyCastle.Crypto.dll`. `CertificateFactoryRandomGenerator` bietet zusätzlich `AddSeedMaterial(ReadOnlySpan<byte>)` und `NextBytes(Span<byte>)`, die der `IRandomGenerator` von `BouncyCastle.Cryptography` ab .NET 6 deklariert. Anwendungen, die die Assemblies selbst verteilen, müssen `BouncyCastle.Cryptography.dll` statt `BouncyCastle.Crypto.dll` verteilen. Anwendungen, die `Portable.BouncyCastle` selbst referenzieren und dessen Typen verwenden, müssen auf `BouncyCastle.Cryptography` umstellen, weil beide Pakete dieselben Typen enthalten.
- Die Abhängigkeit von `System.Management` entfällt.
- **Bruch:** Die Operatoren `<`, `<=`, `>`, `>=` und `==` von `OpcFilterOperand` lösen eine `ArgumentNullException` aus, wenn der linke Operand `null` ist. Die Konstruktoren von `OpcContentFilterElement` lösen eine `ArgumentNullException` für Operanden aus, die `null` sind. Bisher wurde eine `NullReferenceException` ausgelöst. Code, der die `NullReferenceException` abfängt, muss jetzt die `ArgumentNullException` abfangen.
- **Bruch:** Die Klasse `OpcContentFilterElementFactory`, die keine öffentlichen Member hatte, entfällt. Code, der den Typ nennt, lässt sich nicht mehr kompilieren. Eine Instanz des Typs ließ sich nie erhalten.
- **Bruch:** `EndpointDescriptionExtensions.SetEndpointPolicy` löst eine `ArgumentNullException` aus, wenn die Endpunkt-Policy `null` ist. Der Indexer von `OpcSecurityPolicyCollection` löst eine `ArgumentNullException` aus, wenn ihm `null` zugewiesen wird. Bisher löste `SetEndpointPolicy` eine `NullReferenceException` aus, und der Indexer speicherte einen Eintrag ohne Policy. Code, der die `NullReferenceException` abfängt, muss jetzt die `ArgumentNullException` abfangen. Code, der über den Indexer `null` zuweist, schlägt jetzt fehl.
- **Bruch:** Das Ereignis `CertificateRequested` von `OpcServer` und `OpcClient` tritt auch ein, wenn das Anwendungszertifikat vorhanden, aber ungültig ist, mit dem Grund `Invalid`, `UseNotAllowed`, `Revoked`, `TimeInvalid`, `IssuerUseNotAllowed`, `IssuerRevoked` oder `IssuerTimeInvalid` (zum Beispiel `TimeInvalid` bei einem abgelaufenen Zertifikat). Das Zertifikat wird nie automatisch ersetzt (`AutoCreateCertificate` der Ereignisdaten ist `false`). Stellt der Handler kein alternatives Zertifikat bereit, bleibt es in Gebrauch, und ein Trace-Eintrag wird geschrieben. Bisher wurde ein solches Zertifikat ohne Hinweis verwendet. Das Ereignis tritt jetzt auch ein, wenn ein Server mit einem ungültigen Anwendungszertifikat startet oder ein Client sich damit verbindet. Handler, die jeden Grund wie ein fehlendes Zertifikat behandeln, werden also auch in diesem Fall aufgerufen.
- **Bruch:** `OpcEventContext` entfällt; das SDK hat diesen Typ nie erstellt oder zurückgegeben. Code, der `OpcEventContext` verwendet, lässt sich nicht mehr kompilieren.
- **Bruch:** `ExtensionObjectExtensions.To<T>` löst für ein Extension Object, das `null` ist, eine `ArgumentNullException` statt einer `NullReferenceException` aus. `Children` von `OpcAddObjectTypeNode` und `OpcAddVariableTypeNode` lösen eine `ArgumentNullException` statt einer `NullReferenceException` aus, wenn ein Command hinzugefügt oder zugewiesen wird, der `null` ist. Code, der die `NullReferenceException` abfängt, muss jetzt die `ArgumentNullException` abfangen.
- Ein eigener `IOpcNodeHistoryProvider` sollte auch den Wert direkt vor und den Wert direkt nach dem angeforderten Zeitraum liefern, damit der Server Werte interpolieren kann, wenn die Historie zu bestimmten Zeitpunkten oder verarbeitet gelesen wird. Andernfalls ergeben solche Lesevorgänge weiterhin `BadNoData`.
- **Bruch:** `OpcNodeHistory<T>` verwendet als Standardkapazität -1 (unbegrenzt) statt 0. Mit 0 schlug jeder Aufruf von `Add` fehl. Eine Kapazität von 0 oder kleiner als -1 wird jetzt mit einer `ArgumentOutOfRangeException` abgelehnt, auch von den Konstruktoren von `OpcNodeHistorian`. Code, der die Kapazität 0 übergibt (zum Beispiel `new OpcNodeHistory<T>(0, values)`), schlägt jetzt mit einer `ArgumentOutOfRangeException` fehl.
- **Bruch:** `OpcNodeHistorian.ModifiedHistory` ist ein `OpcModifiedNodeHistory` statt eines `OpcNodeHistory<OpcModifiedHistoryValue>`. Code, der die Eigenschaft als `OpcNodeHistory<OpcModifiedHistoryValue>` verwendet, muss angepasst werden: `GetValues(DateTime)` ersetzt den Indexer nach Zeitstempel, `RemoveAt(DateTime)`, `Replace` und das Ereignis `Replaced` gibt es nicht mehr. Code, der gegen eine ältere Version kompiliert wurde, muss neu kompiliert werden.
- **Bruch:** Das Lesen (zum Beispiel mit `OpcClient.ReadNodeHistoryModified`) und das Löschen (zum Beispiel mit `OpcClient.DeleteNodeHistoryModified`) der geänderten Historie eines `OpcNodeHistorian` beziehen sich auf die Zeitstempel der Werte statt auf die Änderungszeitpunkte. Mehrere Änderungen eines Werts kommen in der Reihenfolge von der neuesten zur ältesten, auch beim Rückwärtslesen. Code, der die geänderte Historie über einen Zeitraum von Änderungszeitpunkten liest oder löscht, erhält oder löscht jetzt andere Werte.
- **Bruch:** `OpcClient.BrowseNode(OpcBrowseNode)` und `OpcClient.BrowseNodes` lösen für einen Command, der `null` ist, eine `ArgumentNullException` aus. Bisher wurde eine `NullReferenceException` ausgelöst. Code, der die `NullReferenceException` abfängt, muss jetzt die `ArgumentNullException` abfangen.
- **Bruch:** `OpcClient.CallFunc` löst eine `InvalidCastException` aus, wenn das erste Ausgabeargument `null` ist und der Ergebnistyp ein Werttyp ist, der nicht `null` sein kann. Bisher wurde eine `NullReferenceException` ausgelöst. Code, der die `NullReferenceException` abfängt, muss jetzt die `InvalidCastException` abfangen.
- **Bruch:** `OpcClient.CallMethods` löst für einen Command, der `null` ist, eine `ArgumentNullException` aus. Bisher wurde ein solcher Command übersprungen, sodass die Ergebnisse der folgenden Commands am Index des vorherigen Commands zurückgegeben wurden. Ein Aufruf, bei dem alle Commands `null` waren, schlug mit einer `OpcException` mit `BadNothingToDo` fehl. Code, der einen Command übergibt, der `null` ist, schlägt jetzt fehl, statt verschobene Ergebnisse zu erhalten.
- **Bruch:** Die Überladungen für einen einzelnen Command `OpcClient.CallMethod(OpcCallMethod)`, `ReadNodeHistory(..., OpcReadNodeHistory)`, `CreateNodeHistory`, `ReplaceNodeHistory`, `UpdateNodeHistory`, `DeleteNodeHistory`, `DeleteNodeHistoryAtTime` und `DeleteNodeHistoryModified` lösen für einen Command, der `null` ist, eine `ArgumentNullException` mit dem `ParamName` `command` aus. Bisher lautete der `ParamName` `commands.Item`, und `CallMethod(OpcCallMethod)` schlug mit einer `OpcException` mit `BadNothingToDo` fehl. Code, der für einen Command, der `null` ist, die `OpcException` von `CallMethod(OpcCallMethod)` abfängt, muss jetzt die `ArgumentNullException` abfangen.
- **Bruch:** Die Konstruktoren von `OpcServer`, die eine Folge von Nodes übernehmen, lösen für einen Node, der `null` ist, eine `ArgumentNullException` aus. Bisher schlug `OpcServer.Start()` mit einer `OpcException` fehl. Die Ausnahme tritt jetzt beim Erstellen des Servers auf und ist eine `ArgumentNullException` statt einer `OpcException`.
- **Bruch:** `OpcNode.ReadAttributeValueCore` und `OpcNode.WriteAttributeValueCore` lösen für einen Wert, der `null` ist, eine `ArgumentNullException` aus. Bisher wurde eine `NullReferenceException` ausgelöst. Eine abgeleitete Klasse, die die `NullReferenceException` abfängt, muss jetzt die `ArgumentNullException` abfangen.
- **Bruch:** Die aus Commands erstellten Dienstanfragen (zum Beispiel `OpcCallMethodsRequest`, `OpcReadNodesRequest` oder `OpcWriteNodesRequest`) lösen für einen Command, der `null` ist, eine `ArgumentNullException` aus. Bisher wurde ein solcher Command übersprungen, sodass die Ergebnisse der folgenden Commands dem falschen Command zugeordnet wurden. Code, der einen Command übergibt, der `null` ist, schlägt jetzt fehl, statt verschobene Ergebnisse zu erhalten.
- **Bruch:** `OpcClient.CreateSubscription` löst eine `OpcException` mit `BadServerNotConnected` aus, wenn der Client nicht verbunden oder bereits getrennt wurde. Bisher wurde eine `NullReferenceException` ausgelöst. Code, der die `NullReferenceException` abfängt, muss jetzt die `OpcException` abfangen.
- **Bruch:** `OpcEventFilterFactory.Select` löst für Operanden, die `null` sind, eine `ArgumentNullException` aus. Bisher wurde eine `NullReferenceException` ausgelöst, während der Client verbunden war. Code, der die `NullReferenceException` abfängt, muss jetzt die `ArgumentNullException` abfangen.
- **Bruch:** `OpcEventFilterConstrainedFactory.Where` verknüpft die angegebene Bedingung mit der Bedingung der Factory durch ein logisches UND, wie ein einzelnes `Where` mit beiden Bedingungen, verknüpft durch den Operator `&`. Bisher wurden die Elemente der angegebenen Bedingung nur angehängt. Dadurch blieb die erste Bedingung das Wurzelelement des Filters, und Element-Operanden der angehängten Bedingung verwiesen auf falsche Elemente. Ein Ereignisfilter aus verketteten Aufrufen von `Where` schränkt die Ereignisse jetzt nach allen Bedingungen ein, sodass ein MonitoredItem möglicherweise weniger Ereignisse erhält als bisher.
- **Bruch:** `OpcClientApplication.Exit` trennt den Client auch in den Zuständen `Connecting`, `Reconnecting` und `Reconnected` (der Zustand, den der Client nach einer Wiederverbindung mit derselben Sitzung annimmt). Während sich der Client verbindet, wartet `Exit`, bis der Verbindungsaufbau abgeschlossen ist. In einer nicht interaktiven Umgebung beendet `Exit` auch `Run`, wenn der Client bereits getrennt ist, zum Beispiel weil die Wiederverbindung fehlgeschlagen ist. Bisher tat `Exit` in diesen Zuständen nichts: Der Client blieb verbunden oder versuchte weiter, sich wieder zu verbinden, und `Run` kehrte in einer nicht interaktiven Umgebung nicht zurück (zum Beispiel wurde ein Dienst nicht beendet). Die Ereignisse `Exiting` und `Exited` treten jetzt auch in den Zuständen `Connecting`, `Reconnecting` und `Reconnected` ein.
- **Bruch:** Die Konstruktoren von `OpcClientApplication`, `OpcServerApplication` und `OpcServerServiceApplication` prüfen ihre Argumente, bevor die Anwendung für den aktuellen Thread registriert wird. Bisher blieb nach einem Konstruktor, der eine `ArgumentNullException` auslöste, die fehlgeschlagene Instanz registriert: `OpcApplication.Current` lieferte sie, und der nächste Konstruktor im selben Thread löste eine `InvalidOperationException` aus, bis die Garbage Collection die Instanz freigegeben hatte. Nach einem fehlgeschlagenen Erstellen liefert `OpcApplication.Current` jetzt `null` statt der fehlgeschlagenen Instanz.
- Eine Anwendung, die ohne Aufruf von `Exit` von der Garbage Collection freigegeben wurde, verhindert nicht mehr, dass im selben Thread die nächste Anwendung erstellt wird. Bisher löste der nächste Konstruktor eine `ArgumentException` aus.
- Anwendungen lassen sich gleichzeitig in mehreren Threads erstellen und beenden. Bisher konnte das die Registrierung beschädigen, sodass `OpcApplication.Current` die Anwendung eines anderen Threads lieferte oder eine Ausnahme ausgelöst wurde.
- **Bruch:** `OpcServerApplication.Exit` stoppt den Server auch im Zustand `Suspended`. Bisher tat `Exit` in diesem Zustand nichts, sodass der Server angehalten blieb und `Run` in einer nicht interaktiven Umgebung nicht zurückkehrte. Die Ereignisse `Exiting` und `Exited` treten jetzt auch in diesem Zustand ein.
- `OpcNodeManager.SyncRoot`, `GetNode(string)` und `IsNodeReadyToPublish` lösen eine `InvalidOperationException` aus, solange der Server, der den Node-Manager verwendet, noch nicht gestartet ist, wie die anderen Member des Node-Managers, die einen gestarteten Server voraussetzen. Bisher wurde eine `NullReferenceException` ausgelöst.
- `OpcClient.BrowseNode` und `BrowseNodes` verwenden `OpcBrowseNode.IncludeSubtypes`, sobald die Eigenschaft gesetzt ist, wie der Dienst Browse. Ein Command, bei dem der Wert nicht gesetzt ist, folgt wie bisher den Subtypen seiner Referenztypen.
- **Bruch:** Die HTTPS-Endpunkte des `OpcServer` überlassen die Wahl der TLS-Versionen dem Betriebssystem, statt TLS 1.0, 1.1 und 1.2 anzubieten. Clients, die nur TLS 1.0 oder 1.1 unterstützen, können sich nicht mehr über HTTPS verbinden, wenn das Betriebssystem diese Versionen deaktiviert hat.

**Behoben**
- Problem mit den Operatoren `&` und `|` von `OpcContentFilterElement`, die ein Element mit einem über seinen Konstruktor erstellten `OpcContentFilter` verknüpfen (zum Beispiel `new OpcContentFilter(element1) & element2`). Die Verknüpfung schlug mit einer `NullReferenceException` fehl. Das Element wird jetzt mit den bisherigen Elementen des Filters verknüpft.
- **Bruch:** Problem mit `OpcFilterOperand.Between`, das die Operanden in der Reihenfolge untere Grenze, Operand, obere Grenze übergab. Dadurch prüfte zum Beispiel `a.Between(1, 5)`, ob 1 zwischen `a` und 5 liegt, statt ob `a` zwischen 1 und 5 liegt. Die Operanden werden jetzt in der Reihenfolge übergeben, die OPC UA festlegt. Code, der das Problem ausgeglichen hat, indem er `Between` auf der unteren Grenze aufruft (zum Beispiel `lower.Between(a, upper)`), prüft jetzt, ob die untere Grenze zwischen `a` und der oberen Grenze liegt, und muss auf `a.Between(lower, upper)` umgestellt werden.
- Problem mit der Meldung der `NotSupportedException`, die der Operator `!=` von `OpcFilterOperand` auslöst. Sie schlug den Ausdruck `(a < b || a > b)` vor, der sich nicht kompilieren lässt. Die Meldung schlägt jetzt `(a < b) | (a > b)` vor.
- Problem mit der Überladung von `OpcHistoryValue.CreateModified`, die einen Wert übernimmt. Sie setzte den Wert auch in den Daten des Historienwerts, auf dem sie aufgerufen wurde, während dessen Eigenschaft `Value` weiterhin den vorherigen Wert lieferte. Der geänderte Wert verwendet jetzt eine Kopie der Daten, und der Historienwert bleibt unverändert.
- **Bruch:** Problem mit `OpcHistoryValue.Create(OpcValue)`, das einen Historienwert erstellte, der die Daten des angegebenen Werts teilte. Wurde der Wert eines der beiden gesetzt, änderten sich die Daten des anderen, während dessen Eigenschaft `Value` weiterhin den vorherigen Wert lieferte. Der Historienwert verwendet jetzt eine Kopie der Daten. Code, der einen `OpcValue` nach der Übergabe an `Create` ändert oder einen mit `Create` erstellten Historienwert ändert, ändert die Daten des jeweils anderen Werts nicht mehr.
- Problem mit dem Konstruktor von `OpcCertificateStoreInfo`, der mit einer `NullReferenceException` fehlschlug, wenn der Speichertyp `OpcCertificateStoreType.Application` und der Pfad eines Zertifikatspeichers des Betriebssystems (zum Beispiel `CurrentUser\My`) angegeben waren.
- **Bruch:** Problem mit `OpcSecurityPolicyCollection.CopyTo`, das jede Policy ab dem angegebenen Array-Index an denselben Index des Arrays kopierte, sodass die Policies vor diesem Index fehlten. Bei einem leeren Array schlug die Methode mit einer `ArgumentOutOfRangeException` fehl. Die Methode kopiert jetzt alle Policies ab dem angegebenen Index in das Array, wie `List<T>.CopyTo`, und löst eine `ArgumentException` aus, wenn das Array zu klein ist. Code, der einen Array-Index größer als null übergibt, erhält alle Policies ab diesem Index statt eines Teils davon an ihrem eigenen Index. Code, der ein Array übergibt, das für alle Policies zu klein ist, erhält eine `ArgumentException`.
- **Bruch:** Problem mit dem Ereignis `CertificateRequested` von `OpcServer` und `OpcClient`, bei dem ein über `AlternativeCertificate` der Ereignisdaten bereitgestelltes Zertifikat nicht verwendet wurde: Ein Server ohne Anwendungszertifikat startete nicht („Server does not have an instance certificate assigned“), andernfalls blieb das Zertifikat des Anwendungsspeichers in Gebrauch. Das bereitgestellte Zertifikat wird jetzt verwendet, auch bei späteren Starts und Verbindungen; es muss seinen privaten Schlüssel enthalten. Handler, die `AlternativeCertificate` auf ein anderes Zertifikat setzen, ändern jetzt das Zertifikat, das die Anwendung verwendet.
- **Bruch:** Problem mit `OpcStruct`, bei dem das Erstellen des Datentyps einer Struktur mit einem Array-Feld, dessen Datentyp unbekannt ist, mit einer `NullReferenceException` fehlschlug. Jetzt wird eine `InvalidOperationException` ausgelöst, die den Datentyp, das Feld und die Struktur nennt. Code, der in diesem Fall die `NullReferenceException` abfängt, fängt die `InvalidOperationException` nicht ab.
- **Bruch:** Problem mit `OpcEnum`: Felder ohne Wert erhielten den Wert 0, wenn ein anderes Feld mit einem Wert ungleich 0 definiert war, und die angegebenen Instanzen von `OpcEnumField` wurden verändert. Wie in C# folgt ein Feld ohne Wert jetzt dem Wert des vorherigen Felds (`A, B, C = 5, D` ergibt 0, 1, 5, 6), und die angegebenen Instanzen bleiben unverändert. Enumerationen mit Feldern ohne Wert neben Feldern mit Wert sowie Enumerationen, deren Felder alle mit dem Wert 0 definiert sind, erhalten andere Werte. `Value` eines ohne Wert angegebenen `OpcEnumField` bleibt 0, und `GetFields` liefert Kopien.
- Problem mit `EnumStrings` von `OpcMultiStateDiscreteNode`: Das Lesen der Eigenschaft eines Nodes, dessen Variable EnumStrings keinen Wert hat, löste eine `ArgumentNullException` aus. Die Eigenschaft liefert in diesem Fall jetzt `null`. Das Problem bestand seit Version 2.53.0.0.
- Problem mit `AvailableStates` und `AvailableTransitions` von `OpcFiniteStateMachineNode`: Das Lesen der Eigenschaft eines Zustandsautomaten ohne die optionale Variable AvailableStates oder AvailableTransitions oder ohne deren Wert löste eine `ArgumentNullException` aus. Die Eigenschaft liefert in diesem Fall jetzt `null`. Das Problem bestand seit Version 2.54.0.0.
- Problem mit `OpcFiniteStateMachineNode<T>`: Ein Zustandsautomat, dessen Zustände über einen Typ bezeichnet werden, der keine Enumeration ist (zum Beispiel `uint`), endete mit einer `StackOverflowException`, wenn der Unterzustandsautomat eines Zustands erstellt wurde. Die Zustandsnummer wird jetzt in `T` umgewandelt und an `CreateSubStatesMachineNode(T)` übergeben. Das Problem bestand seit Version 2.54.1.0.
- Problem mit den Membern, die ein Node-Typ von seinem Basistyp erbt (zum Beispiel geliefert von `OpcNodeTypeInfo.GetMembers` eines Subtyps): Das Lesen von `Parent` eines geerbten Variablen- oder Objekt-Members endete mit einer `StackOverflowException`, die die Anwendung beendete. `Parent` liefert jetzt das übergeordnete Element des Members, den der Basistyp deklariert. Das Problem bestand seit Version 2.50.4.0.
- Problem mit dem Konstruktor von `OpcClassicInterface`, der für eine Schnittstellenspezifikation ohne Namen und ohne Version mit einer `NullReferenceException` fehlschlug. In diesem Fall werden jetzt die Version 1.0 und ein Name aus der Kategorie und dieser Version verwendet. Das Problem bestand seit Version 2.6.0.0.
- Problem mit `OpcMethodNode.Call`: Jeder Eintrag einer nicht leeren Liste `outputArguments` wurde vor den Ausgabeargumenten der Methode ein zweites Mal zur Liste hinzugefügt. Die Methode fügt jetzt nur ihre Ausgabeargumente zur Liste hinzu. Das Problem bestand seit Version 2.33.0.0.
- **Bruch:** Problem mit dem `OpcServer`, bei dem eine Anfrage der Dienste AddNodes, AddReferences, DeleteNodes, DeleteReferences oder Call, die einen Command mit einem Null-Bezeichner enthielt, als Ganzes abgelehnt wurde (`BadNothingToDo`, bei AddNodes, DeleteNodes und DeleteReferences `BadUnexpectedError`). Die übrigen Commands werden jetzt ausgeführt, und der Command mit dem Null-Bezeichner erhält den Status, den OPC UA festlegt (`BadParentNodeIdInvalid`, `BadNodeIdInvalid`, `BadSourceNodeIdInvalid`, `BadTargetNodeIdInvalid`, `BadReferenceTypeIdInvalid` oder `BadMethodInvalid`). Das Problem bestand seit Version 2.7.0.0, bei Call seit Version 2.50.5.0. Eine solche Anfrage wird nicht mehr abgelehnt: `RequestValidating` tritt mit einem guten Ergebnis ein, die Anfrage wird verarbeitet und nicht in `RejectedRequestsCount` der Serverdiagnose gezählt. Serveranwendungen, die sich auf die Ablehnung verlassen haben, müssen Commands mit einem Null-Bezeichner selbst behandeln.
- Problem mit dem Dienst AddNodes des `OpcServer`, der einen Node der NodeClass `Unspecified` nicht als ungültige NodeClass ablehnte. Der Server meldet für einen solchen Node jetzt `BadNodeClassInvalid`, wie OPC UA es festlegt. Das Problem bestand seit Version 2.7.0.0.
- Problem mit dem Dienst AddNodes des `OpcServer`, der einen Node, den der Server nicht erstellen konnte, mit dem Status `Good` und ohne NodeId als hinzugefügt meldete. Der Server meldet für einen solchen Node jetzt `BadNotSupported`. Das Problem bestand seit Version 2.7.0.0.
- Problem mit `OpcNodeHistory<T>.Enumerate(DateTime?)` und `Enumerate(DateTime?, DateTime?)`, die Werte außerhalb des Zeitraums lieferten, wenn eine Grenze nicht der Zeitstempel eines Werts war, zum Beispiel alle Werte vor der Startzeit oder nach der Endzeit. Die Methoden liefern jetzt die Werte innerhalb des Zeitraums einschließlich seiner Grenzen.
- Problem mit `OpcNodeHistory<T>.RemoveRange(DateTime?)` und `RemoveRange(DateTime?, DateTime?)`, die keinen Wert entfernten, wenn eine Grenze `null`, `DateTime.MinValue` oder `DateTime.MaxValue` war. Dadurch entfernte `RemoveRange(DateTime?)` nie einen Wert. Eine solche Grenze schränkt den Zeitraum jetzt nicht ein. Ein `OpcNodeHistorian` meldet damit keine Werte mehr als gelöscht, ohne sie zu löschen, wenn ein Client die Historie eines Nodes ohne Start- oder Endzeit löscht.
- Problem beim Lesen der Historie eines Nodes zu bestimmten Zeitpunkten (zum Beispiel mit `OpcClient.ReadNodeHistoryAtTime`) oder der verarbeiteten Historie (zum Beispiel mit `OpcClient.ReadNodeHistoryProcessed`) von einem `OpcServer`: Ein Zeitpunkt zwischen zwei Werten ergab `BadNoData` statt eines interpolierten Werts. `OpcNodeHistorian.ReadHistory` liefert jetzt auch den Wert direkt vor und den Wert direkt nach dem Zeitraum, aus denen der Server den Wert zu oder vor einem angeforderten Zeitpunkt ermittelt. Das Lesen der Rohwerte der Historie mit `ReturnBounds` liefert jetzt die Grenzwerte statt `BadBoundNotFound`.
- Problem mit den Historiendiensten von `OpcNodeHistorian` für einen Node mit dem ValueRank `Any`, `ScalarOrOneDimension` oder `OneOrMoreDimensions`, die jeden Wert mit `BadTypeMismatch` ablehnten. Ein Wert wird jetzt angenommen, wenn sein ValueRank für den ValueRank des Nodes gültig ist.
- Problem mit `OpcNodeHistorian`, der `PercentDataBad` und `PercentDataGood` der AggregateConfiguration des Nodes nur auf 0 oder 100 setzte. Die Prozentwerte werden jetzt aus der Anzahl schlechter und guter Werte berechnet.
- Problem mit `OpcSubscriptionDiagnostics.RepublishMessageRequestCount`, den der Server je Republish-Anfrage zweimal erhöhte.
- Problem mit `OpcReadNodeHistoryDetails.ReturnBounds` (zum Beispiel von `OpcReadNodeHistoryRawDetails`), dessen Setter unabhängig vom übergebenen Wert `true` setzte. Dadurch ließen sich die Grenzwerte nicht mehr abschalten, nachdem sie einmal angefordert waren.
- Problem mit dem Konstruktor von `OpcNodeHistorian`, der `HistoryReadOrWrite` zu `AccessLevel` und `UserAccessLevel` des Nodes hinzufügte und `IsHistorizing` setzte, bevor er eine ungültige Kapazität mit einer `ArgumentOutOfRangeException` ablehnte. Die Argumente werden jetzt geprüft, bevor der Node geändert wird, und die Ausnahme nennt bei einem ungültigen `modifiedCapacity` den Parameter `modifiedCapacity` statt `capacity`.
- Problem beim Löschen der Rohwerte oder der geänderten Werte der Historie eines Nodes in einem Zeitraum (zum Beispiel mit `OpcClient.DeleteNodeHistory` oder `OpcClient.DeleteNodeHistoryModified` mit Start- oder Endzeit) in einem `OpcServer`, das stattdessen die gesamte Historie des Nodes löschte. Das Problem bestand seit Version 2.7.0.0.
- Problem beim Einfügen oder Ersetzen der Historie eines Nodes (zum Beispiel mit `OpcClient.CreateNodeHistory` oder `OpcClient.ReplaceNodeHistory`) in einem `OpcServer`, der jedes Einfügen und Ersetzen als Aktualisierung verarbeitete. Das Einfügen eines Werts am Zeitstempel eines vorhandenen Werts ersetzte diesen, statt `BadEntryExists` zu ergeben, und das Ersetzen eines Werts an einem Zeitstempel ohne Wert fügte ihn ein, statt `BadNoEntryExists` zu ergeben. Das Problem bestand seit Version 2.7.0.0.
- Problem mit `OpcUpdateNodeHistoryDataDetails` und `OpcUpdateNodeHistoryStructureDataDetails` einer Anfrage, die ein `OpcServer` empfängt (zum Beispiel im Ereignis `RequestValidating`), deren `Values` `null` waren.
- Problem mit den Historiendiensten von `OpcNodeHistorian` (`CreateHistory`, `UpdateHistory`, `ReplaceHistory` und `DeleteHistory`), die ab dem zweiten Wert eines Aufrufs mit einer `ArgumentException` fehlschlugen, weil die geänderte Historie nur einen Wert je Änderungszeitpunkt speicherte. Ein Client erhielt für den Node `BadUnexpectedError`, obwohl die vorherigen Werte bereits geändert waren. Jede Änderung wird jetzt gespeichert.
- Problem mit `OpcServer.RegisterNamespace(Uri)`, das eine URI, die kein gültiger Namespace ist, in die Namespace-Tabelle eintrug, bevor es sie mit einer `FormatException` ablehnte.
- `NullReferenceException` in `OpcClientIdentity.Matches` für eine Identität, die mit dem Passwort `null` erstellt wurde. Eine solche Identität passt jetzt zu keinem Passwort.
- Problem mit `OpcAccessControlEntry.EndpointAccessMode`, das den `OperationAccessMode` des Eintrags statt des Zugriffsmodus der Endpunkte lieferte. Die Zugriffskontrolle selbst war nicht betroffen: Ob ein Endpunkt für einen Principal aktiviert oder deaktiviert ist, wurde bereits anhand des Zugriffsmodus der Endpunkte ausgewertet.
- Problem mit `OpcServerDiagnostics.IsEnabled`, das eine `ArgumentOutOfRangeException` auslöste, wenn die Diagnose bei laufendem Server abgeschaltet wurde, während der Server noch die Diagnosedaten mindestens einer Subscription hielt.
- Problem mit `OpcDataTypeSystem.Default` und `OpcNodeTypeSystem.Default` (zum Beispiel `GetTypes`), die mit einer `FileNotFoundException` fehlschlugen, weil die vordefinierten Nodes von OPC UA (Ressource `Opc.Ua.PredefinedNodes.uanodes`) nicht in die Assembly eingebettet waren. Die Ressource ist jetzt eingebettet, und ihre Datentyp-Nodes, die auch das Attribut DataTypeDefinition angeben, werden korrekt gelesen. (nur `Opc.UaFx.Client`)
- Problem mit `EnumValues` von `OpcMultiStateValueDiscreteNode` und `Value` von `OpcEnumValuesPropertyNode`, die eine `ArgumentNullException` auslösten, wenn die Variable EnumValues keinen Wert hatte. Ein Server mit einem solchen Node startete deshalb nicht. Beide liefern in diesem Fall jetzt `null`.
- Problem mit `OpcFiniteStateMachineNode`, das mit einer `NullReferenceException` fehlschlug, wenn sein Typ für einen Zustand einen Unterzustandsautomaten deklarierte, die Klasse dafür aber keinen Node erstellte (siehe `CreateSubStatesMachineNode`). Ein Server mit einem solchen Zustandsautomaten startete deshalb nicht.

### 2.58

> **2.58.0.0 (freigegeben am 30.10.2026)**
>
> **Neu**
> - Neue Eigenschaft `OpcCertificateSettings.Organization`. Sie nimmt die Organisation (O) in das Subject des Anwendungsinstanzzertifikats auf, das das SDK erstellt, wie OPC UA es fordert. Bei einem `OpcServer` stammt die Organisation aus `OpcServerInfo.CompanyName`. Ohne bekannte Organisation bleibt das Subject wie bisher.
> - Neue Member `OpcRequestProcessedEventArgs.RequestType` und `IsUnsupportedService` sowie die neuen Member `RegisterServer`, `RegisterServer2` und `FindServersOnNetwork` von `OpcRequestType`. Damit erkennt ein Server, welchen Dienst eine Anfrage aufgerufen hat, auch bei Diensten, die er nicht unterstützt.
> - Neues Ereignis `SessionActivationFailed` des `OpcServer`. Es tritt bei jeder abgelehnten Aktivierung einer Sitzung ein und nennt die Identität, die der Client verwendet hat (`OpcUserNameIdentityTokenInfo`, `OpcCertificateIdentityTokenInfo`), ohne deren Passwort oder Token-Daten.
> - Neue Einstellung `OpcServerDiagnostics.IsEnabled`, die die Diagnose von Sitzungen und Subscriptions einschaltet (Standardwert `false`).
> - Neu: `OpcServer.Discovery` mit `OpcServerDiscovery.RegistrationInterval`, dem Intervall, in dem sich der Server am lokalen Discovery-Server registriert (Standardwert 30000 ms; 0 schaltet die Registrierung ab).
> - Neue Überladungen von `OpcDiscoveryClient.DiscoverEndpoints` und `DiscoverServers`, die nach Transportprofil und Server-URI filtern.
> - `OpcBrowseNode.IncludeSubtypes` ist jetzt öffentlich (Standardwert `false`), und `OpcViewDescription` bietet öffentliche Konstruktoren, um eine View zu browsen. `IncludeSubtypes` wirkt in dieser Version nur über `client.Services.Browse`; `BrowseNode` und `BrowseNodes` werten die Eigenschaft noch nicht aus.
> - Neue Methode `OpcClient.ChangeUserIdentity`, um die Benutzeridentität einer verbundenen Sitzung zu wechseln.
> - Neu: `OpcClient.ReconnectInterval` legt die Zeit zwischen zwei Versuchen fest, die Verbindung wiederherzustellen (bisher `ReconnectTimeout`, das als verborgener Alias erhalten bleibt). `OpcClient.MaxReconnectDuration` beendet diese Versuche nach der angegebenen Zeit (Standardwert 0, unbegrenzt).
> - Neue Methode `OpcDataFieldInfo.GetLength`, die die maximale Länge jeder Dimension eines Felds angibt.
> - **Bruch:** Neuer Typ `OpcRawObject`. Er stellt den Wert einer Struktur, die das SDK nicht dekodieren kann (ein unbekannter Datentyp oder ein Feld ohne festen ValueRank), mit seiner Kodierung und seinem kodierten Inhalt dar. `OpcData.Encode` kodiert eine Struktur als `OpcRawObject`. Code, der für den Wert einer unbekannten Struktur ein Byte-Array oder ein `XmlElement` erwartet hat, erhält jetzt ein `OpcRawObject`. Dessen `RawData` enthält, was bisher zurückgegeben wurde.
> - **Bruch:** Neue Attribute `RolePermissions`, `UserRolePermissions`, `AccessRestrictions` und `AccessLevelEx` in `OpcAttribute` und `OpcAttributes`, das neue Member `DataTypeDefinition` von `OpcAttributes` sowie die neuen Typen `OpcRolePermission` und `OpcPermissions`. Das Lesen des Attributs DataTypeDefinition liefert jetzt ein `OpcDataTypeInfo` statt einer `StructureDefinition` oder `EnumDefinition` des Stacks. Das Lesen von RolePermissions oder UserRolePermissions liefert ein Array von `OpcRolePermission` statt `RolePermissionType`.
> - Neue Einstellung `OpcServerSecurity.IsAuditingEnabled` (Standardwert `false`) sowie die Audit-Ereignisse der Secure-Channel-Dienste (AuditOpenSecureChannelEventType, AuditChannelEventType).
> - Das Trace-Ereignis des Stacks (`Opc.Ua.Tracing.Instance.TraceEventHandler`) liefert die protokollierte Ausnahme in `TraceEventArgs.Exception`.
>
> **Geändert**
> - **Bruch:** Die `CertificateFactory` des Stacks ist nicht mehr Teil der öffentlichen API des Pakets, weil das SDK weder das Signieren durch eine Zertifizierungsstelle (CA) noch das Erzeugen von Sperrlisten (CRL) anbietet. Code, der `CertificateFactory` verwendet, lässt sich nicht mehr kompilieren.
> - **Bruch:** `OpcSecurityAlgorithm.Auto` sowie die Standardendpunkte des Discovery-Servers und des OPC-Classic-Wrapper-Servers verwenden `Basic256Sha256` statt der veralteten Policies `Basic256` (`Sign`) und `Basic128Rsa15` (`SignAndEncrypt`). Ein Client mit `Auto` verbindet sich nicht mehr mit einem Server, der nur die veralteten Policies anbietet.
> - Das Zertifikat, das das SDK für einen `OpcServer` erstellt, nennt auch den vollqualifizierten Namen des Rechners. So akzeptieren es Clients, die sich über diesen Namen verbinden. Ein vorhandenes Zertifikat bleibt unverändert.
> - **Bruch:** Der `OpcServer` meldet Audit-Ereignisse nur noch, solange `OpcServerSecurity.IsAuditingEnabled` den Wert `true` hat. Er meldet sie nur an Clients, die über `SignAndEncrypt` oder HTTPS mit einem Benutzer in der Rolle SecurityAdmin verbunden sind, wie OPC UA es festlegt. Audit-Ereignisse zu Sitzungen meldet ein Server erst, nachdem `IsAuditingEnabled` auf `true` gesetzt wurde.
> - **Bruch:** `State`, `StateChanged` und `BreakDetected` des `OpcClient` folgen einem Verbindungsverlust, den ein fehlschlagender Dienstaufruf erkennt (zum Beispiel `BadConnectionClosed` oder `BadSessionIdInvalid`), sofort statt erst mit dem nächsten Keep-Alive. Eine neu erstellte Sitzung verbindet sich innerhalb eines Intervalls wieder mit einem neu gestarteten Server. Code, der sich darauf verlassen hat, dass sich der Zustand nur mit dem Keep-Alive ändert, sieht die Änderung jetzt früher.
> - **Bruch:** Das Datentypsystem von OPC UA enthält jetzt alle vordefinierten Datentypen (zum Beispiel `Integer`, `UInteger`, `Enumeration` oder `Image`). Jeder Datentyp nennt seinen Supertyp als `BaseType`. Felder von Datentypen, die von einem eingebauten Typ abgeleitet sind (zum Beispiel `Duration`, `UtcTime` oder `LocaleId`), werden jetzt dekodiert. Eingebaute Typen und die Strukturen von OPC UA nennen ihren Supertyp jetzt als `BaseType`, bisher nannten sie keinen. Ein Feld eines von `ByteString` abgeleiteten Typs liefert ein `ByteString` statt eines Byte-Arrays.
> - Der `OpcServer` meldet eine Verbindung, die ein Client zurückgesetzt hat, im Trace nicht mehr als Fehler, weder beim Lesen noch beim Schließen des Sockets.
> - **Bruch:** `OpcClient.ReconnectTimeout` und `DefaultReconnectTimeout` sind als veraltet (obsolete) gekennzeichnet. Verwenden Sie stattdessen `ReconnectInterval` und `DefaultReconnectInterval`. Code, der sie verwendet, erhält eine Compiler-Warnung und mit `TreatWarningsAsErrors` einen Compiler-Fehler.
> - **Bruch:** Die Historiendienste für einzelne Nodes `OpcClient.ReadNodeHistoryProcessed`, `ReadNodeHistoryAtTime` und `ReadNodeHistoryModified` lösen für einen Node, den der Server abgelehnt hat, eine `OpcException` mit dem Statuscode des Servers aus (zum Beispiel `BadAggregateNotSupported`). Für einen Node, den der Server ohne Werte akzeptiert hat, liefern sie ein leeres Ergebnis. Bisher wurde in beiden Fällen eine `KeyNotFoundException` ausgelöst. Code, der die `KeyNotFoundException` abfängt, muss jetzt die `OpcException` abfangen.
> - **Bruch:** `OpcDiscoveryClient` (`DiscoverEndpoints`, `DiscoverServers` und seine Konstruktoren) löst eine `OpcException` mit dem Grund aus (zum Beispiel `BadSecureChannelClosed`), wenn der Server nicht erreichbar ist, den Kanal während des Handshakes schließt oder die Discovery-URL ein nicht unterstütztes Schema verwendet. Die Navigatoren der Historie von `OpcClient.ReadNodeHistory` und `ReadEventHistory` lösen eine `OpcException` mit `BadCommunicationError` aus, wenn eine Seite nicht innerhalb der maximalen Anzahl von Anfragen abgeschlossen wurde. Bisher wurde die `ServiceResultException` des Stacks ausgelöst. Code, der die `ServiceResultException` abfängt, muss jetzt die `OpcException` abfangen.
> - **Bruch:** `OpcViewDescription.Default` ist jetzt ein statisches, schreibgeschütztes Feld (`static readonly`), damit sich die Standard-View nicht ersetzen lässt. Code, der `OpcViewDescription.Default` einen Wert zuweist, lässt sich nicht mehr kompilieren. Code, der gegen eine ältere Version kompiliert wurde und `OpcViewDescription.Default` liest, muss neu kompiliert werden, weil aus der Eigenschaft ein Feld geworden ist.
>
> **Behoben**
> - Problem mit Methoden im `OpcServer`, die über einen Command implementiert sind (zum Beispiel eine Methode eines importierten NodeSets, implementiert mit `OpcNodeSetManager.ImplementNodeCallback`) und ein Argument mit dem ValueRank `Any`, `ScalarOrOneDimension` oder `OneOrMoreDimensions` deklarieren. Jeder Aufruf einer solchen Methode schlug mit einer `IndexOutOfRangeException` fehl. Der Wert eines solchen Arguments wird jetzt je nach empfangenem Wert als Skalar oder als Array an den Command übergeben. Ein Array von ByteStrings kommt zum Beispiel als `ByteString[]` an, wie bei einem Argument, das als eindimensionales Array deklariert ist.
> - Problem mit Nodes, die mit dem Modell ihres Typs erstellt wurden (zum Beispiel Instanzen von Companion-Spezifikationen). Ihre Variablen übernahmen die Zugriffsebenen und Schreibmasken des NodeSets nicht und ließen sich trotzdem schreiben. Das Problem bestand seit Version 2.50.6.0.
> - Problem mit Notifiern, die mit `OpcNodeManager.AddNotifierNode` hinzugefügt wurden. Ein Client, der die Notifier-Hierarchie ab dem Server-Objekt browst, fand sie nicht.
> - Problem mit Arrays von `object` (zum Beispiel ein Methodenargument mit dem Datentyp BaseDataType und dem ValueRank `OneDimension`), die als Array von Strukturen statt als Array von Varianten kodiert wurden.
> - Problem mit dem `OpcServer`, der einen Endpunkt mehrfach anbot, wenn eine Endpunkt-Policy mehr als einmal konfiguriert war. Der Server behält beim Start die erste Policy und entfernt die Wiederholungen.
> - Problem mit dem `OpcServer`, der bei jedem Start den Fehler „Could not load CertificateTrustList for UserTokenPolicy“ im Trace meldete.
> - **Bruch:** Problem mit dem `OpcServer`, bei dem ein Start die `ServerConfiguration` der Anwendung veränderte. Dadurch bot ein Neustart anonymen Zugriff an, obwohl nur die `OpcUserNameAcl` aktiviert war. Der Server arbeitet jetzt mit einer Kopie der Konfiguration. Code, der `Configuration.ServerConfiguration` nach dem Start liest, sieht die Werte, die er selbst gesetzt hat, statt der verwendeten Policies.
> - Problem mit `OpcClient.Connect`, das mit einer `IndexOutOfRangeException` fehlschlug, wenn die Data Type Dictionaries des Servers eine NamespaceUri gar nicht oder mehrfach angeben. Ein Dictionary, das sich nicht laden lässt, wird ausgelassen und im Trace gemeldet. Das Problem bestand seit Version 2.8.0.0.
> - Problem mit dem `OpcNodeManager`, der beim Ändern eines MonitoredItems `MonitoredItemsDeleted` statt `MonitoredItemsModified` auslöste. Das Problem bestand seit Version 2.7.4.0.
> - Problem mit dem `OpcClient`, der sich nicht mit einem Server verbinden konnte, der eine User-Token-Policy mit einer nicht unterstützten Security-Policy (zum Beispiel `RSA_DH_AesGcm`) vor einer unterstützten anbietet.
> - Problem mit dem `OpcServer`, der mit einer `StackOverflowException` beendet wurde, wenn die Diagnose aktiviert war, ein Client die Diagnose der Sitzungen oder Subscriptions überwachte und eine andere Sitzung einen Sitzungsdienst aufrief.
> - **Bruch:** Problem beim Lesen der verarbeiteten Historie (zum Beispiel mit `OpcClient.ReadNodeHistoryProcessed`), das beide Zeitstempel anforderte. Dadurch konnte ein Server die Anfrage mit `BadTimestampsToReturnInvalid` ablehnen. Das Problem bestand seit Version 1.5.11.0. Die verarbeiteten Werte tragen keinen Server-Zeitstempel mehr.
> - Problem mit dem `OpcServer`, bei dem eine Anfrage zum Lesen der geänderten Historie als `OpcReadNodeHistoryRawDetails` statt als `OpcReadNodeHistoryModifiedDetails` ankam. Das Problem bestand seit Version 2.7.0.0.
> - Problem mit mehrdimensionalen Feldern einer Struktur (zum Beispiel `UInt16[2,3,2]`), die bei der Kodierung der Struktur ausgelassen wurden. Das Problem bestand seit Version 2.8.0.0.
> - Problem mit einem `OpcStatusCode`, der sich weder als Methodenargument übergeben noch als Wert schreiben ließ.
> - Problem mit dem `OpcClient`, der im Zustand `Reconnecting` blieb, wenn der Server nach dem Wiederverbinden eine seiner Subscriptions ablehnte. Das Problem bestand seit Version 2.32.0.0.
> - **Bruch:** Problem mit einer Struktur aus einem Data Type Dictionary, deren Feld auf einen Datentyp verweist, der nur über seine DataTypeDefinition bekannt ist. Der Client konnte eine solche Struktur nicht auflösen. Das Problem bestand seit Version 2.40.0.0. `Name` und `XmlName` eines solchen Datentyps nennen jetzt den Namespace seines Nodes statt des Namespace von OPC UA.
> - Problem mit Feldern, die mit einem Datentyp ohne eigene Definition deklariert sind (zum Beispiel einem herstellerspezifischen Subtyp von `Byte`). Sie nannten den nächstliegenden Supertyp statt ihres deklarierten Datentyps. Außerdem lieferte `OpcClient.GetDataType` für einen solchen Datentyp keinen Datentyp.
> - Problem mit einem Variablen-Node eines Array-Typs, der ohne Wert erstellt wurde (zum Beispiel `new OpcDataVariableNode<int[]>(name)`). Er nannte einen skalaren ValueRank und keine Array-Dimensionen. Das Problem bestand seit Version 2.52.0.0.
> - Problem mit einer Matrix von Strukturen, deren Kodierung mit einer `InvalidCastException` fehlschlug. Das Problem bestand seit Version 2.9.2.0.
> - Problem mit den Retain-Policies von Conditions, die eine Condition nicht in jedem Zustand beibehielten, den sie nennen. So wurde zum Beispiel ein aktiver Alarm nicht mehr beibehalten, sobald er quittiert war. Das Problem bestand seit Version 2.55.0.0.
> - Problem mit dem GDS Push Management des `OpcServer`. CreateSigningRequest lehnte einen vom Client übergebenen Subject-Namen ab und forderte weder die Organisation noch die Anwendungs-URI des Zertifikats an. UpdateCertificate lehnte ein Zertifikat ab, dessen Subject sich in mehr als dem Common Name vom aktuellen unterschied. ApplyChanges ließ den Server ohne das neue Zertifikat oder ohne dessen privaten Schlüssel zurück, sodass Verbindungen mit `Sign` oder `SignAndEncrypt` fehlschlugen. Das Problem bestand seit Version 2.53.0.0.
> - Problem mit dem GDS Push Management des `OpcServer`, das keine unterstützten Formate für private Schlüssel nannte, solange keine Formate konfiguriert waren (jetzt PFX und PEM). Außerdem lehnte es CreateSigningRequest und UpdateCertificate ohne Zertifikatstyp ab, auch bei einer Zertifikatsgruppe mit nur einem Typ. Das Problem bestand seit Version 2.53.0.0.
> - `KeyNotFoundException` in den Diensten zum Aktualisieren der Historie einzelner Nodes `OpcClient.CreateNodeHistory`, `ReplaceNodeHistory`, `UpdateNodeHistory`, `DeleteNodeHistory`, `DeleteNodeHistoryAtTime` und `DeleteNodeHistoryModified` bei einer NodeId, die nur einen Namespace-Index angibt (zum Beispiel `ns=2;s=Value`). Die Ergebnisse der Dienste zum Aktualisieren der Historie verwenden jetzt die NodeId des Commands als Schlüssel.
> - Endloses Lesen der Historie, wenn der Server einen Node auf einer Folgeseite ablehnt, weil der Fortsetzungspunkt des abgelehnten Nodes auf jeder Seite erneut angefordert wurde. Das Problem bestand seit Version 1.6.5.0.
> - Problem mit einer neuen Subscription, deren MonitoredItems der Server abgelehnt hat. Wenn das anschließende Löschen der Subscription ebenfalls fehlschlug, ersetzte dieser Fehler den der MonitoredItems. Die `OpcException` nennt jetzt den Grund, aus dem die MonitoredItems abgelehnt wurden. Das Problem bestand seit Version 2.32.0.0.
> - Ausnahme unter Linux mit neueren OpenSSL-Versionen beim Erstellen eines Anwendungszertifikats.

### 2.57

> **2.57.1.0 (freigegeben am 23.10.2026)**
>
> **Neu**
> - Neues Ereignis `NotificationFailed` in `OpcSubscription` und `OpcClient` sowie der zugehörige Handler `OpcSubscriptionSetup.NotificationFailed`. Das Ereignis tritt ein, wenn eine Benachrichtigung des Servers nicht empfangen werden konnte, zum Beispiel weil sich ein Wert darin nicht dekodieren lässt. Bisher wurden die Datenänderungen und Ereignisse einer solchen Benachrichtigung ohne Hinweis verworfen. Das Ereignis löst zuerst die `OpcSubscription` aus, zu der die Benachrichtigung gehört, und, wenn es dort nicht behandelt wird, der `OpcClient`. Eine Benachrichtigung, deren Subscription (noch) nicht bekannt ist, meldet nur der `OpcClient`.
> - Neuer Wert `OpcAttribute.DataTypeDefinition`, um das Attribut DataTypeDefinition eines Datentyp-Nodes zu lesen.
>
> **Behoben**
> - Problem mit strukturierten Datentypen, die nur über ihre DataTypeDefinition bekannt sind (zum Beispiel mit `OpcClient.UseDynamic`) und ein Member eines anderen strukturierten Datentyps deklarieren. Seit Version 2.57.0 wurde ein solches Member ohne seine Felder dekodiert. Dadurch konnten die danach dekodierten Werte falsch sein, Ereignisse mit einer solchen Struktur wurden ohne Hinweis verworfen, oder die Dekodierung schlug mit einer überschrittenen `MaxStringLength` oder dem Statuscode `BadEncodingLimitsExceeded` fehl.
> - Problem mit strukturierten Datentypen, die nur über ihre DataTypeDefinition bekannt sind und ein Member eines einfachen Datentyps ohne eigene Definition deklarieren (zum Beispiel ein herstellerspezifischer Subtyp von `Byte`, `UInt16` oder `String`). Das Dekodieren einer solchen Struktur schlug mit einer `ArgumentNullException` fehl, der gesamte Lesevorgang mit dem Statuscode `BadUnknownResponse`. Ein solches Member wird jetzt als der nächstliegende Supertyp dekodiert, den der Client kennt.
> - Deadlock zwischen Browse-Anfragen und Änderungen am Node-Manager, die unter der Sperre des Node-Managers vorgenommen werden.
> - Problem mit Ereignissen eines eingebauten Ereignistyps im `OpcClient`. Seit Version 2.56.0 wurde ein solches Ereignis als Instanz eines der Basistypen seines Ereignistyps erzeugt, zum Beispiel eine Dialog-Condition als `OpcCondition` statt als `OpcDialogCondition` oder eine Alarm-Condition als `OpcAcknowledgeableCondition` statt als `OpcAlarmCondition`.
> - Problem, durch das `OpcClient.Connect()` fehlschlug, wenn `UseDynamic` aktiviert ist und der Server dieselbe HasSubtype- oder HasEncoding-Referenz eines Datentyps mehrfach sendet.
> - `NullReferenceException` im `OpcClient` bei Servern, die einen Endpunkt ohne URL liefern.

> **2.57.0.0 (freigegeben am 14.09.2026)**
>
> **Behoben**
> - Problem mit strukturierten Datentypen, die `OpcEncodingMaskKind.Auto` verwenden und deren erstes optionales Member nicht gesetzt ist. Werte, die nach einem solchen Member dekodiert wurden, konnten falsch sein, oder die Dekodierung schlug mit einer `EndOfStreamException` oder einer `ServiceResultException` fehl, die eine überschrittene `MaxStringLength` meldete.
> - Problem mit Membern eines strukturierten Datentyps, die als einer der Wrapper-Typen `OpcText`, `OpcName`, `OpcNodeId`, `OpcValue` oder `OpcEngineeringUnitInfo` deklariert sind. Ein solches Member wird jetzt einheitlich kodiert und dekodiert, unabhängig davon, ob es einen Wert oder eine Null-Referenz enthält.
> - Problem mit Membern eines strukturierten Datentyps, die als Nullable-Werttyp deklariert sind (zum Beispiel `int?`, `short?`, `double?` oder `DateTime?`). Der Wert eines solchen Members bleibt jetzt erhalten.
> - `NullReferenceException` beim Dekodieren eines strukturierten Datentyps mit einem Array-Member, das nicht optional ist und eine Null-Referenz enthält.
> - `InvalidCastException` beim Dekodieren eines Arrays von `Guid`-Werten.
> - Problem mit leeren Arrays der Wrapper-Typen `OpcText`, `OpcName`, `OpcValue` und `OpcEngineeringUnitInfo`. Als Member eines strukturierten Datentyps wird ein solches Array jetzt als leeres Array statt als Null-Referenz kodiert. Als Parameter eines Methodenaufrufs wird es jetzt als Array des Typs übergeben, den die aufgerufene Methode deklariert, und vom Server akzeptiert. Bisher wurde für einen solchen Parameter nur eine Null-Referenz akzeptiert.
> - Problem, bei dem ein leeres Array von `OpcNodeId`-Werten als Array erweiterter NodeIds übergeben wurde.

### 2.56

> **2.56.0.0 (freigegeben am 19.08.2026)**
>
> **Behoben**
> - Sichergestellt, dass der `RetainState` nicht automatisch durch einen anderen Unterzustand als den `EnableState` aktualisiert wird, wenn die `RetainPolicy` den Wert `Manual` hat.
> - Fehlerhaft behandelte `nodeChanges` in `OpcNode.UpdateChanges`: Der angegebene Parameter wurde nicht an die verwendeten Handler übergeben und ging dadurch verloren. Nur die bereits ausstehenden Änderungen wurden an die Handler für Benachrichtigungen über Datenänderungen weitergeleitet.
> - Problem mit falscher Auflösung des Ereignistyps im `OpcClient`, wenn ein Ereignistyp nur über eine erweiterte NodeId registriert ist (zum Beispiel über `OpcNamespace.GetId`, wobei der Instanz von `OpcNamespace` kein Namespace-Index zugewiesen ist). Dadurch wurden immer Instanzen von `OpcEvent` empfangen statt des spezifischen Subtyps von `OpcEvent` oder eines benutzerdefinierten typisierten Speichers für Ereignisdaten.

### 2.55

> **2.55.0.0 (freigegeben am 07.08.2026)**
>
> **Neu**
> - Neue Eigenschaft `OpcConditionNode.IsRetainedPolicy` in `OpcConditionNode`. Sie überschreibt die Standardlogik, die den Wert der Eigenschaft `OpcConditionNode.IsRetained` abhängig von den Zuständen der Condition-Nodes steuert (zum Beispiel `EnableState`, `ActiveState`, `AckedState` und `ConfirmState`). Der Standardwert dieser Eigenschaft hängt vom verwendeten Subtyp von `OpcConditionNode` ab. Mit dem Wert `OpcConditionRetainPolicy.Manual` für die Eigenschaft `IsRetainedPolicy` erhalten Sie die volle Kontrolle über die Eigenschaft `IsRetained`.
>
> **Geändert**
> - Der Initialwert der Eigenschaft `OpcConditionNode.IsRetained` und ihrer Subtypen (`OpcAcknowledgeableConditionNode` und `OpcAlarmConditionNode`) einschließlich der davon abgeleiteten Subtypen kann ab dieser Version abweichen. So entspricht der Initialwert der Zustandsmaschine des jeweiligen Condition-Typs. Die einzelnen Conditions beschreibt OPC UA Part 9, weitere Details enthält die Dokumentation der neuen Enumeration `OpcConditionRetainPolicy`. Der jeweilige Condition-Typ verwendet standardmäßig die passende Policy, um konforme Initialwerte zu liefern. Um das zu überschreiben, setzen Sie die Eigenschaft `OpcConditionNode.IsRetainedPolicy` auf den Wert `OpcConditionRetainPolicy.Manual`. Damit erhalten Sie die volle Kontrolle über die Eigenschaft `IsRetained`.
>
> **Behoben**
> - `StackOverflowException`, wenn der Rechner unter Last steht.

### 2.54

> **2.54.1.1 (freigegeben am 27.07.2026)**
>
> **Behoben**
> - `StackOverflowException` in der neuen Klasse `OpcFiniteStateMachineNode<T>` bei Verwendung von `ChangeStateTo`.

> **2.54.1.0 (freigegeben am 22.07.2026)**
>
> **Neu**
> - Unterstützung für dynamische Datentypen, die rekursiv auf sich selbst verweisen.
> - Neue geschützte virtuelle Eigenschaft `InheritReferenceTypeId` für `OpcInstanceNodes`, die steuert, ob die `DefaultReferenceTypeId` an die direkten Kind-Nodes vererbt wird.
> - Neue Methode `OpcNodeSet.GetNodes`, die den gesamten in einem NodeSet definierten Adressraum liefert.
>
> **Behoben**
> - Problem mit falsch generiertem Attribut DataTypeDefinition im `OpcServer` bei strukturierten Datentypen mit optionalen Feldern und `OpcEncodingMaskKind.Explicit`.
> - Problem mit falscher Kodierung optionaler Felder im `OpcClient`, wenn `UseDynamic` aktiviert ist und der Server kein `TypeDictionary` bereitstellt.
> - Problem, bei dem die Methode `OpcNodeSet.GetNode` nur Nodes ausgehend vom Root-Node fand. Die Methode findet jetzt jeden Node im geladenen NodeSet.
> - Problem beim Abrufen von Nodes mit der Methode `OpcNodeSet.GetNode` nach dem Laden eines NodeSets ohne benutzerdefinierten Kontext mit passenden Namespace-URIs.

> **2.54.0.0 (freigegeben am 25.06.2026)**
>
> **Neu**
> - Neue Eigenschaft `SupportedTokenTypes` in `OpcEndpointDescription`. Sie liefert eine aufzählbare Folge der unterstützten `OpcAccessControlTokenType`-Werte, über die sich die unterstützten Zugriffssteuerungslisten des vom Server bereitgestellten Endpunkts ermitteln lassen. Die Werte lassen sich mit `OpcDiscoveryClient.DiscoverEndpoints(...)` abfragen.
> - Neue Eigenschaften `AvailableStates` und `AvailableTransitions` in `OpcFiniteStateMachineNode`.
> - Neue Eigenschaft `SupportCurrentState` für Zustandsmaschinen, die den verpflichtenden CurrentState-Node nicht unterstützen. Wenn Sie die Eigenschaft überschreiben, deaktivieren Sie die Unterstützung von CurrentState einschließlich der Aufrufe der Methode `ChangeStateTo`. Der CurrentState-Node liefert dann `Bad` als Statuscode und `BAD` als Wert, sein Kind-Node „Id“ liefert eine Null-Referenz als Wert.
> - Unterstützung für die Bereitstellung der Ereignis-Historie im `OpcServer` über die Schnittstelle `IOpcEventHistoryProvider` und für das Lesen der Ereignis-Historie im `OpcClient` über die Methode `ReadEventHistory`.
> - Neue Eigenschaft `OpcServerBinding.UseExclusiveAddress`, die festlegt, ob nur ein Prozess an den Port binden darf.
>
> **Geändert**
> - Erweiterte Zertifikatvalidierung, insbesondere für Anwendungsinstanzzertifikate, mit konformer Validierung der Erweiterung Basic Constraints. Das ist für die CTT-Konformität erforderlich.
> - Der Listener-Socket verwendet beim Binden an den Port jetzt standardmäßig eine exklusive Adresse. Die neue Eigenschaft `OpcServerBinding.UseExclusiveAddress` steuert dieses Verhalten.
>
> **Behoben**
> - Problem mit undefinierten Array-Dimensionen von Variablen-Nodes und Definitionen strukturierter Datentypen in NodeSet-Dateien, die einen ValueRank größer als null definieren. Das Attribut ArrayDimensions wird jetzt anhand des Werts des Attributs ValueRank mit einem leeren Array von Dimensionen initialisiert.
> - `ArgumentNullException` im `OpcServer`, wenn ein Client ConditionRefresh aufruft. Hinweis: Als Nebeneffekt dieser Korrektur kann das SDK beim Aufruf von ConditionRefresh jetzt automatisch Ereignisdaten senden, auch wenn die Anwendung den `QueryEventsCallback` nicht implementiert.
> - Problem mit fehlenden strukturierten Datentypen in `OpcNodeSet` nach dem Import einer Datei `NodeSet2.xml`, die mehrere Datentypen nur über `DataTypeDefinitions` und teilweise über zusätzliche `DataTypeDescriptions` definiert. Diese `DataTypeDescriptions` werden nicht von `DataTypeEncodings` referenziert, die ihrerseits keine inversen Referenzen auf ihren kodierten Datentyp-Node verwenden. In solchen Fällen ignoriert die API jede `DataTypeDescription` und liefert die Informationen zum Datentyp aus der DataTypeDefinition des Datentyp-Nodes.
> - `NullReferenceException` beim Aufruf von `OpcServer.GetDataTypes()`, wenn ein NodeSet geladen wurde, das eine leere Strukturdefinition enthält.
> - `NullReferenceException` beim Import von NodeSets, die als Namespace-URI eine Zeichenkette verwenden, die sich nicht als URI parsen lässt.
> - `OpcPropertyNode<T>` war im Adressraum nicht sichtbar, wenn der Typparameter `T` ein Wrapper-Typ wie `OpcText` war und ein Konstruktor mit Eltern-Node verwendet wurde.
> - Die Methoden `OpcText.Equals()` und `.CompareTo()` konnten eine `NullReferenceException` auslösen und ein falsches Vergleichsergebnis liefern.
> - Der `OpcServer` konnte bei begrenzter Größe zu viele History-Werte liefern.

### 2.53

> **2.53.1.0 (freigegeben am 06.05.2026)**
>
> **Behoben**
> - Ausnahme, wenn einige Typen in Benutzer-Assemblies nicht geladen werden konnten, bei Verwendung eines `OpcServer` oder eines `OpcClient` mit aktivierter dynamischer Typregistrierung.
> - Problem, bei dem benutzerdefinierten Nodes, die nach dem Start des `OpcServer` mit `OpcNodeManager.AddNode()` hinzugefügt wurden, manchmal die hierarchische Referenz vom Eltern-Node fehlte.

> **2.53.0.0 (freigegeben am 16.04.2026)**
>
> **Neu**
> - Neue Eigenschaft `OpcServer.UseDynamic` zusammen mit den Typen `OpcStruct`, `OpcStructField`, `OpcEnum` und `OpcEnumField`, mit denen sich Datentypen für den `OpcServer` dynamisch definieren lassen.
> - Neuer Typ `OpcEnumValue`, der Enumerationswerte mit dem OPC-UA-Datentyp `EnumValueType` darstellt.
> - Zwei neue statische Methoden (Shared in Visual Basic) in `OpcEnum`, die die Enumerationswerte einer typisierten Enumeration liefern. Wie die Informationen ermittelt werden, steuern die Attribute `OpcEnumAttribute`, `OpcEnumMemberAttribute` und `EnumMemberAttribute`.
> - Neuer `OpcEnumValuesPropertyNode`, um benutzerdefinierte `OpcEnumValues` im Adressraum des Servers zu veröffentlichen.
> - Neue Nodes `OpcMultiStateDiscreteNode` und `OpcMultiStateValueDiscreteNode` mit jeweils einer generischen Implementierung. Sie entsprechen in ihrer Verwendung den in OPC UA definierten Node-Typen MultiStateDiscreteType und MultiStateValueDiscreteType.
> - Neue Klasse `OpcAccessControlRole`, die Standardrollen darstellt und benutzerdefinierte Rollen definiert, in denen `OpcPrincipals` Mitglied sein können.
> - Neue Klasse `OpcServerSecurityRoles`, die alle Standardrollen bereitstellt, die der `OpcServer` üblicherweise kennt.
> - Neue Eigenschaften `Roles` und `AccessControlRoles` in `OpcServerSecurity`: Die erste liefert alle Standardrollen von OPC UA, die zweite die Rollen, die der `OpcServer` aktuell verwendet. In dieser Implementierung sind alle Instanzen der Standardrollen in der Eigenschaft `AccessControlRoles` enthalten.
> - Neue Methoden `Assign` und `Revoke` in `OpcAccessControlEntry`, die die Rollenmitgliedschaften des Principals im Eintrag steuern.
> - Neue Methode `IsInRole` in `OpcPrincipal`, die ermittelt, ob der Principal Mitglied einer bestimmten Rolle ist.
> - Automatische Zuweisung des anonymen Principals zur Rolle Anonymous.
> - Automatische Zuweisung aller anderen Principals zur Rolle `AuthenticatedUser`. Benutzerdefinierte Zugriffssteuerungslisten müssen sicherstellen, dass authentifizierte Principals ebenfalls dieser Rolle zugewiesen werden.
> - Neues Ereignis `CertificateChanged` in `OpcServer`, das ausgelöst wird, wenn eine Sitzung mit einer Identität, die Mitglied der Rolle `SecurityAdmin` ist, das Zertifikat des Servers ändert.
> - Unterstützung für GDS Push Management mit `ServerConfigurationType`, `UpdateCertificate`, `TrustList` und rollenbasierter Authentifizierung über die Rolle `SecurityAdmin`. Um GDS Push Management zu aktivieren, muss die benutzerdefinierte Implementierung des `OpcServer` mindestens einen ACL-Eintrag bereitstellen, der der Rolle `SecurityAdmin` zugewiesen ist.
>
> **Behoben**
> - Problem mit doppelten Kind-Referenzen bei Nodes, die eingebettete, von der Foundation definierte Instanzen von `NodeState` für einen ganzen Node-Baum verwenden, wobei die Kind-Nodes durch den `NodeState` und nicht durch den Benutzercode definiert sind. Das betrifft seit Version 2.51.4.1 komplexe Foundation-Nodes, die im Benutzercode erstellt und nicht aus einem NodeSet importiert werden.

### 2.52

> **2.52.0.0 (freigegeben am 13.03.2026)**
>
> **Neu**
> - Neue abstrakte Subtypen `OpcDiscreteItemNode` und `OpcDiscreteItemNode<T>` der Basisklasse `OpcDataItemNode`.
> - Neuer Subtyp `OpcTwoStateDiscreteNode` der Basisklasse `OpcDiscreteItemNode`.
> - Unterstützung der neuen Security-Policy-Algorithmen `Aes128_Sha256_RsaOaep` und `Aes256_Sha256_RsaPss`.
>
> **Behoben**
> - CTT-Problem mit falschem Statuscode `BadSessionClosed` statt `BadNoSubscription`, wenn eine Sitzung ein Publish ohne Subscription anfordert.
> - Problem mit nicht funktionierender automatischer Zuweisung der NodeId für `ShelvingState` in `OpcAlarmConditionNode`.
> - Problem mit nicht initialisiertem Attribut ValueRank nach dem Erstellen einer nicht generischen Instanz von `OpcVariableNode` ohne Übergabe eines Werts.

### 2.51

> **2.51.4.1 (freigegeben am 18.02.2026)**
>
> **Behoben**
> - Problem mit doppelten Kind-Referenzen für aus NodeSets importierte Nodes, insbesondere bei HasComponent-Referenzen.

> **2.51.4.0 (freigegeben am 18.02.2026)**
>
> **Neu**
> - Neue Eigenschaft `OpcServer.EstimatedReturnTime` zur Unterstützung der CTT-Konformität. Die Eigenschaft aktualisiert direkt den Wert des zugehörigen Nodes unter `Objects/Server/EstimatedReturnTime`. So können Clients Wertänderungen des Nodes abonnieren, die neueste geschätzte Rückkehrzeit des Servers vor dem Herunterfahren erhalten und ihre Wiederverbindungslogik darauf abstimmen.
> - Verbessertes `OpcNodeModel` mit zusätzlichen Überladungen für `CreateByDefault`, `OmitByDefault` und `OmitOptionals` mit einem zusätzlichen booleschen Parameter `recursive`. Er steuert, ob die Standardwerte und Direktiven nur auf das Modell oder auch auf seine Kinder angewendet werden.
> - Unterstützung für die modellabhängige Erstellung des optionalen LastTransition-Nodes in Zustandsmaschinen-Nodes hinzugefügt.
> - Logik zur Unterstützung serverbezogener Operationsgrenzen (mit `OpcServer.OperationLimits.AutoDetermineLimits`) gemäß CTT-Konformität hinzugefügt.
> - Die Implementierung des internen `OpcOperationLimiter` wurde überarbeitet und liefert praktikablere Standardgrenzen, wenn `AutoDetermineLimits` aktiviert ist.

> **2.51.3.0 (freigegeben am 12.02.2026)**
>
> **Neu**
> - Clientseitige Unterstützung von `ResendData` über `OpcSubscription.ResendData`, um aktuelle Werte von MonitoredItems im Reporting-Modus abzufragen.
>
> **Behoben**
> - Problem im OPC UA Server bei der Behandlung ausstehender `ResendData`-Anfragen, insbesondere wenn sich der aktuelle Wert zwischenzeitlich nicht geändert hat.
> - Problem, durch das der Typ `OpcNodeId` in Definitionen strukturierter Datentypen seit Version 2.50.0 auf `ExpandedNodeId` statt auf NodeId abgebildet wurde.
> - Problem, durch das mit `OpcVariableNode.Value` gesetzte Werte bei einem benutzerdefinierten Datentyp unter Umständen nicht in die Historie des `OpcNodeHistorian` aufgenommen wurden.
> - Problem bei der mit Version 2.50 eingeführten rekursiven automatischen Zuweisung von NodeIds, wenn Standard-Nodes mit Kind-Nodes erstellt werden, deren relative Baumtiefe größer als eins ist.
> - Problem beim Import von NodeSets mit Typdefinitionen, die nicht in hierarchischer Reihenfolge stehen.

> **2.51.2.0 (freigegeben am 12.01.2026)**
>
> **Behoben**
> - Problem, durch das `OpcClient.Connect()` fehlschlagen konnte, wenn `UseDynamic` aktiviert ist und der Server einen oder mehrere TypeDictionary-Nodes bereitstellt, die beim Lesen den Status `BadNotReadable` liefern. In diesem Fall wird der Fehler jetzt ignoriert und ein leeres TypeDictionary verwendet.

> **2.51.1.0 (freigegeben am 27.11.2025)**
>
> **Behoben**
> - Falscher Statuscode von `ActivateSession` bei ungültigem Sitzungsbezeichner oder leerer Client-Signatur (CTT-Konformität).
> - Die `PolicyId` der `UserTokenPolicy`-Einträge war in den von `GetEndpoints` gelieferten Endpunktbeschreibungen innerhalb des Servers nicht eindeutig (CTT-Konformität).
> - Wenn ein Client ein `UserNameIdentityToken` mit leerem Benutzernamen sendet, wird jetzt der Statuscode `BadIdentityTokenInvalid` zurückgegeben (CTT-Konformität).

> **2.51.0.0 (freigegeben am 24.11.2025)**
>
> **Geändert**
> - Bei Verwendung von .NET Framework ist jetzt Version 4.7.2 oder höher erforderlich.
> - Die Methode `IOpcNodeHistoryProvider.ReadHistory()` hat neue Parameter erhalten, um History-Werte zu streamen, statt alle Werte im Speicher zu puffern. Insbesondere muss die Implementierung die Werte jetzt in umgekehrter Reihenfolge zurückgeben, wenn der Parameter `timeFlowsBackward` den Wert `true` hat.
>
> **Behoben**
> - Problem, durch das das Lesen des `ServerDiagnosticsNode` den Status `BadOutOfService` lieferte, obwohl die Diagnose im `OpcServer` aktiviert war.
> - Problem, durch das eingehende Verbindungen zum `OpcServer` mit `BadUserTokenRejected` fehlschlugen, wenn eine `https:`-URL verwendet wurde.
> - Wenn ein Client eine HistoryRead-Anfrage mit einem Wert für `maxCount` sendet, wird dieser Wert jetzt korrekt berücksichtigt, um die History-Werte beim Senden der Antwort aufzuteilen.
> - ASP.NET-Core-Abhängigkeiten auf Version 2.3.6 aktualisiert.

### 2.50

> **2.50.7.0 (freigegeben am 22.10.2025)**
>
> **Neu**
> - Leistungsverbesserungen beim Erstellen von Variablen-Nodes (vereinfachte und vereinheitlichte Initialisierung).
> - Neue Eigenschaften `UseNodeNameAsDefaultDescription` und `UseNodeNameAsDefaultSymbolicName` in `OpcAutomatism` für die bedingte Initialisierung des Attributs Description und der Eigenschaft `SymbolicName` von `OpcNode`.
>
> **Geändert**
> - Verbesserte CTT-Konformität bei der Standardinitialisierung von `OpcNode`: Die Standardwerte für das Attribut Description und die Eigenschaft `SymbolicName` entfallen unter bestimmten Bedingungen. Für das bisherige Verhalten aktivieren Sie die entsprechenden Eigenschaften in `OpcAutomatism`.
>
> **Behoben**
> - Problem mit überschriebenen Attributen von Variablen-Nodes, die über ein `OpcNodeModel` bereitgestellt werden.

> **2.50.6.2 (freigegeben am 06.10.2025)**
>
> **Behoben**
> - Problem mit `InvalidOperationException` oder `NullReferenceException` beim Erstellen eines `OpcConditionNode` oder eines `OpcHistoryConfigurationNode`.

> **2.50.6.1 (freigegeben am 25.09.2025)**
>
> **Behoben**
> - Problem mit `NullReferenceException` bei NodeSet-Variablen mit undefinierten Array-Dimensionen.

> **2.50.6.0 (freigegeben am 21.09.2025)**
>
> **Neu**
> - `IOpcNodeInfo` um die Eigenschaften `WriteAccess` und `UserWriteAccess` erweitert, die auch die Werte dieser Attribute liefern.
> - Neue Schnittstelle `IOpcVariableNodeInfo` als Subtyp von `IOpcNodeInfo`, um Variablen von anderen Nodes zu unterscheiden und variablenspezifische Attribute bereitzustellen.
> - Unterstützung von Modellattributen, um Nodes mit den in einem Modell definierten Initialwerten der Attribute zu initialisieren.
> - Neue Node-Typ-Implementierungen `OpcAnalogUnitRangeNode` und `OpcAnalogUnitNode`.
>
> **Geändert**
> - Die Eigenschaft `Model` und die übrige API zu `OpcNodeModel` wurden von `OpcInstanceNode` nach `OpcNode` verschoben, um eine korrekte Initialisierung der Nodes sicherzustellen.

> **2.50.5.0 (freigegeben am 17.09.2025)**
>
> **Neu**
> - Erweiterte Authentifizierung mit mehreren Mechanismen zum Schutz vor Brute-Force-Angriffen.
> - Neue Eigenschaft `OpcServer.AuthenticationLimits`, die die neuen Grenzen für den Brute-Force-Schutz bei der Authentifizierung steuert.
> - Node-Typen auf Version 1.05.03 aktualisiert.
> - `BadUserAccessDenied`, wenn eine ungültige Identität verwendet wird, um die Identität einer bestehenden Sitzung zu ändern (CTT-Konformität).
> - Neue Konstruktoren mit einem Parameter vom Typ `OpcNodeModel` für weitere Unterklassen: `OpcConditionNode` (einschließlich seiner Unterklassen), `OpcOrderedObjectNode` und `OpcFileNode`.
>
> **Geändert**
> - Die Validierung von Anfragen wurde überarbeitet: Zuerst wird der Inhalt der Anfrage validiert, danach, ob die angeforderte Operation erlaubt ist. Außerdem werden Diagnoseinformationen (einschließlich Null-Referenzen) nur noch auf Anforderung geliefert. Das dient der CTT-Konformität.
>
> **Behoben**
> - Problem mit `NullReferenceException` in `OpcContext`, wenn er aus einem `OpcOperationContext` erstellt wurde.
> - Problem mit `NullReferenceException` in `OpcNodeId`, wenn `ValueAsString` auf der Instanz `OpcNodeId.Null` abgefragt wird.
> - Problem mit `NullReferenceException` (seit Version 2.50.4) beim Erstellen eines `OpcDataItemNode` (oder einer seiner Unterklassen) nach dem Start des Servers.
> - Problem mit doppelten Eltern-Kind-Referenzen beim Import von NodeSet-Dateien mit typisierten Instanzen.

> **2.50.4.0 (freigegeben am 09.09.2025)**
>
> **Neu**
> - Neue Eigenschaft `OpcServerInfo.ProductUri`, um die `ProductUri` in der Variablen BuildInfo der Variablen `ServerStatus` zu setzen.
> - Neue generische Implementierung von `OpcMethodNode`: `OpcMethodNode<T>` unterstützt typisierte Delegaten und das Ändern des verwendeten Callback-Ziels.
> - Unterstützung für `ResendData(...)` auf den MonitoredItems von Subscriptions.
> - Neue Eigenschaft `OpcServer.OperationLimits`, die die Operationsgrenzen des Servers steuert (vorerst nur unbegrenzt oder automatisch anhand der verfügbaren Systemressourcen ermittelt).
>
> **Geändert**
> - Die `DefaultReferenceTypeId` von `OpcFolderNode` war fälschlich Organizes; stattdessen wird jetzt HasComponent verwendet. Diese Änderung dient der CTT-Konformität.
> - `ServerDiagnostics` liefert keine Kind-Nodes mehr, und jede explizite Lese- oder Schreiboperation auf die Kind-Nodes über ihre NodeId führt zu `BadOutOfService`. Dieses Verhalten gilt bei deaktivierter `ServerDiagnostics` und dient der CTT-Konformität.
>
> **Behoben**
> - Problem mit nicht gemeldetem Statuscode `SemanticsChanged` (`0x4000`) für MonitoredItems beim Schreiben von Werten in semantische Eigenschaften, zum Beispiel eines `OpcAnalogItemNode`.
> - Problem mit doppelten Referenzen beim Browsen des Adressraums importierter Nodes. Das betraf vor allem Methoden-Nodes und ihre InputArguments und OutputArguments.
> - Problem mit nicht konformen Leseergebnissen des Attributs `InverseName` von `ReferenceTypes`: Jetzt wird `BadAttributeIdInvalid` statt einer Null-Referenz (Nothing in Visual Basic) geliefert.
> - Falscher Statuscode in Server-Subscriptions beim Zugriff auf die Subscription einer anderen Sitzung: statt `BadSessionIdInvalid` jetzt `BadSubscriptionIdInvalid`.
> - Falscher Statuscode, wenn die Impersonation eines Identity-Tokens fehlschlägt: statt `BadIdentityTokenInvalid` jetzt `BadIdentityTokenRejected`. Diese Änderung dient der CTT-Konformität.

> **2.50.3.0 (freigegeben am 17.07.2025)**
>
> **Behoben**
> - Problem mit `NullReferenceException` beim Erstellen einer Instanz von `OpcAlarmConditionNode` (oder einer ihrer Unterklassen) im `OpcServer`.

> **2.50.2.0 (freigegeben am 07.07.2025)**
>
> **Neu**
> - Der `OpcServer` liefert jetzt die Informationen zur lokalen Zeitzone des Servers in der Eigenschaft `LocalTime` des Server-Objekts.
> - Unterstützung für das Verfolgen und Melden von Modelländerungen.
> - Neue Eigenschaft `OpcAutomatism.RaiseModelChangeEvents`, um das Verfolgen und Melden von Modelländerungen global zu aktivieren oder zu deaktivieren.
> - Neue Methoden `OpcNode.SuspendModelChangeEvents(...)` und `OpcNode.ResumeModelChangeEvents(...)`, um das Verfolgen und Melden von Modelländerungen je Node zu steuern.
>
> **Behoben**
> - Problem beim Dekodieren strukturierter Datentypen, wenn das erste Feld optional ist.
> - `OpcNodeManager.GetNode(string)` lieferte nicht immer Instanzen von `OpcFiniteStateMachineNode`.
> - Problem beim Empfang von Daten zu `ModelChangeEvent` und GeneralModelChangeEvent im `OpcClient`.
> - Problem mit `NullReferenceException` in `OpcGeneralModelChange`, wenn die Eigenschaft `Changes` des Datenspeichers eine Null-Referenz (Nothing in Visual Basic) war.

> **2.50.1.0 (freigegeben am 16.06.2025)**
>
> **Neu**
> - Unterstützung von Methoden-Membern bei der Reflexion von `NodeType`.
>
> **Behoben**
> - Problem mit Zustandsmaschinen, bei denen jeder Übergang die Übergangsnummer null hat.
> - Problem mit Zustandsmaschinen mit Zuständen, bei denen null eine ungültige Zustandsnummer ist.

> **2.50.0.0 (freigegeben am 12.06.2025)**
>
> **Neu**
> - Unterstützung von `NodeTypeSystem`-Informationen im `OpcServer` und in `OpcContext`.
> - Unterstützung der Erstellung typisierter Node-Instanzen beim Import von Nodes aus einer NodeSet-Datei.
> - Verbesserte dynamische Erstellung typisierter Node-Instanzen beim Laden eines NodeSets.
> - `OpcFiniteStateMachineNode` ermittelt Zustände und Übergänge jetzt aus den Node-Typ-Informationen, wenn keine Attribute zur Definition der Zustände und Übergänge angegeben sind.
> - Thread-lokaler `OpcContext` (über die neue Eigenschaft `OpcContext.Current`) für Szenarien, in denen ein `OpcContext` benötigt, aber über keinen Parameter übergeben wird. Das gilt derzeit nur für Servercode.
> - Neue Eigenschaften `OpcNodeManager.NodeSetImportOptions` und `OpcNodeSetManager.ImportOptions`, mit denen Sie festlegen, dass beim Import aus NodeSets die Strukturfelder der Elterntypen in die DataTypeDefinition-Attribute übernommen werden.
> - Neue Methode `OpcEncoding.Empty()` für leere Encoding-Arrays.
> - Neues `OpcEncodingMask.DefaultAuto` zur Vereinfachung generischer Encoding-Definitionen.
> - Thread-lokaler `OpcContext` (über die neue Eigenschaft `OpcContext.Current`) für Szenarien, in denen ein `OpcContext` benötigt, aber über keinen Parameter übergeben wird, zum Beispiel im Konstruktor eines Nodes.
> - Neue Methode `OpcContext.OfNode`, um in den Kontext eines bestimmten Nodes zu wechseln. Außerdem fügen die Methoden `AddChild` und `RemoveChild` in `OpcInstanceNode` den Kind-Node jetzt dem Node-Manager hinzu, dessen Kontext für die Operation verwendet wird, beziehungsweise entfernen ihn daraus. Der Kind-Node wird also demselben Node-Manager hinzugefügt oder daraus entfernt wie der Node, dessen Kontext an `AddChild` und `RemoveChild` übergeben wird.
> - Neue Methoden `OpcServer.RegisterNamespace` und `OpcServer.RegisterNamespaces`, um bekannte Namespaces vorab zu registrieren. So werden sie in einer bestimmten Reihenfolge registriert und erhalten festgelegte Namespace-Indizes.
> - Neue Methode `OpcNodeManager.IsNodeReadyToPublish(...)`, die ermittelt, ob angewendete Node-Änderungen darauf warten, von mindestens einem MonitoredItem veröffentlicht zu werden.
> - Rekursive Navigation von einer `OpcSession` zu ihren `OpcSubscriptions` und von dort zu deren `OpcMonitoredItems`.
> - Neues Ereignis `OpcNode.ChangesUnhandled`, das ausgelöst wird, wenn Änderungen auf einen Node angewendet werden sollen, aber kein MonitoredItem existiert, das die Node-Änderungen annimmt (zum Beispiel aufgrund eines Filters) und behandelt.
>
> **Geändert**
> - Wenn `OpcClientSecurity.UseOnlySecureEndpoints` auf `true` gesetzt ist, wählt der `OpcClient` jetzt nur noch Endpunkte mit dem Modus `SignAndEncrypt` und nicht mehr solche mit dem Modus `Sign`, da Letzterer keine Vertraulichkeit bietet. Für das bisherige Verhalten (Endpunkte mit `Sign` oder `SignAndEncrypt`) setzen Sie `client.Security.EndpointPolicy` auf eine Policy mit diesem Modus und `OpcClient.Security.AutoUpgradeEndpointPolicy` auf `true`. Alternativ setzen Sie `OpcClient.Security.UseHighLevelEndpoint` auf `true`, um den „besten“ vom Server angebotenen Endpunkt zu wählen. Das bietet allerdings keine Sicherheit.
> - Beim Erstellen eines Ereignisfilters mit `OpcEventFilterFactory.Select()` wird in den einfachen Attributoperanden jetzt standardmäßig der Typbezeichner von `BaseEventType` verwendet (wie vor Version 2.32.0.0). So lassen sich bei mehreren Ereignistypen, die gleichnamige Felder haben können, alle Felder empfangen. Für das bisherige Verhalten, den tatsächlichen Ereignistyp in den einfachen Attributoperanden anzugeben, übergeben Sie `OpcEventFieldSelectOptions.UseExplicitEventTypeIds` an `OpcEventFilterFactory.Select()`.
>
> **Behoben**
> - `NullReferenceException` beim Import eines NodeSets mit einer `FiniteStateMachine` ohne den Kind-Node LastTransition.
> - `NullReferenceExceptions` beim Vergleich zweier Werte der Struktur Number, wenn der zugrunde liegende Wert eine Null-Referenz (Nothing in Visual Basic) ist.
> - Problem, durch das Clients den Fehler `BadNotSupported` erhielten, wenn sie eine neue Verbindung zum Server aufbauen wollten, nachdem ein Client Audit-Ereignisse abonniert hatte.
> - Problem, durch das `OpcEngineeringUnitInfo.CommonCode` eine Zeichenkette mit einem NUL-Zeichen liefern konnte.
> - Problem, das eine `OpcException` beim Lesen eines strukturierten Datentyps mit einem Array verschachtelter strukturierter Datentypen verursachen konnte, wenn `OpcClient.UseDynamic` aktiviert war.
> - Problem, durch das der `OpcServer` Clientverbindungen mit nicht vertrauenswürdigen Zertifikaten akzeptieren konnte, obwohl `OpcSecurity.AutoAcceptUntrustedCertificates` auf `false` gesetzt war.
> - Problem, durch das sich der `OpcClient` mit Endpunkten mit dem Policy-Modus `None` verbinden konnte, wenn der Server nur diese Policy anbot, obwohl `OpcClientSecurity.UseOnlySecureEndpoints` auf `true` gesetzt war.
> - Problem beim Dekodieren strukturierter Datentypen, wenn für ein Array-Feld ein Null-Wert auftrat.
> - Problem mit `InvalidCastException` beim Lesen eines strukturierten Datentyps, der ein Array strukturierter Datentypen enthält.
> - `IndexOutOfRangeException` beim Import eines NodeSets, in dem ein `VariableNode` einen ValueRank von 0 angibt.
> - [Client SDK] Die Methoden `OpcData.Decode<T>(...)`, die mit Version 2.40.0.0 hinzukommen sollten, fehlten im Client SDK (`Opc.UaFx.Client`).

## 2.40–2.42 (2023–2024)

### 2.42

> **2.42.5.0 (freigegeben am 03.12.2024)**
>
> **Behoben**
> - `NullReferenceException`, die intern ausgelöst und abgefangen wurde, wenn eine leere Publish-Response verarbeitet wurde.

> **2.42.4.0 (freigegeben am 21.10.2024)**
>
> **Neu**
> - Impliziter Cast-Operator von `UserIdentityToken` nach `OpcIdentityToken` hinzugefügt.
>
> **Geändert**
> - Die Abhängigkeit `Portable.BouncyCastle` wurde auf Version 1.9.0 aktualisiert, um eine Sicherheitslücke zu beheben.
>
> **Behoben**
> - Fehlerhaft generiertes SwitchValue-Feld für Union-Datentypen im Attribut DataTypeDefinition.

> **2.42.3.0 (freigegeben am 10.09.2024)**
>
> **Neu**
> - Unterstützung für Abo-Lizenzen hinzugefügt.
>
> **Behoben**
> - Problem, durch das `OpcClient.State` beim Aufruf von `OpcClient.Disconnect()` im Zustand `Connecting` stehen bleiben konnte, wenn gleichzeitig ein anderer Thread Methoden wie `OpcClient.CallMethod()` aufruft.

> **2.42.2.0 (freigegeben am 22.08.2024)**
>
> **Neu**
> - Von den Klassen `OpcAccessControlList` und `OpcUserIdentity` kann jetzt abgeleitet werden, und benutzerdefinierte Instanzen von `OpcAccessControlList` lassen sich über die Methode `OpcServerSecurity.AddAccessControlList()` zu einem `OpcServer` hinzufügen.

> **2.42.1.0 (freigegeben am 25.07.2024)**
>
> **Behoben**
> - Problem, bei dem ein Seiteneffekt in einer internen Klasse dazu führen konnte, dass die Methode `OpcNodeIdFactory.Create()` für bestimmte Node-Instanzen nicht aufgerufen wurde.
> - Problem, das eine `InvalidOperationException` in `OpcFiniteStateMachine.ChangeStateTo()` aufgrund eines falschen Vergleichs von `OpcNodeId`-Werten verursachte.

> **2.42.0.1 (freigegeben am 07.06.2024)**
>
> **Behoben**
> - Ungültig generiertes Längenfeld für Arrays im Attribut DataTypeDefinition in Unterklassen, wenn das Feld in der Basisklasse deklariert ist.

> **2.42.0.0 (freigegeben am 05.06.2024)**
>
> **Neu**
> - Neue Eigenschaft `OpcAutomatism.UseNullInsteadOfEmptyArrays`, die verschiedene Array-, List- und Collection-Eigenschaften hinsichtlich ihrer unterstützten und kodierten Werte steuert. Wenn diese Eigenschaft auf `true` gesetzt ist, setzen einige Eigenschaften eine Null-Referenz (Nothing in Visual Basic) nicht mehr auf ein leeres Array, eine leere Liste oder Collection. Außerdem kodieren sie diese Werte mit der Array-Größe `-1`. Wenn ein Server oder Client ein leeres Array, eine leere Liste oder Collection benötigt, muss die Eigenschaft `OpcAutomatism.UseNullInsteadOfEmptyArrays` auf `false` gesetzt werden. Das führt zu leeren Array-, Listen- und Collection-Werten, die mit der Array-Größe null kodiert werden.
>
> **Geändert**
> - `OpcArgument.ArrayDimensions` und `OpcArgumentInfo.ArrayDimensions` unterstützen jetzt Null-Referenzen (Nothing in Visual Basic), wenn das über `OpcAutomatism.UseNullInsteadOfEmptyArrays` aktiviert ist. Wenn ein Server den Wert `null` für die `ArrayDimensions` angibt, gibt diese Eigenschaft jetzt also ebenfalls eine Null-Referenz (Nothing in Visual Basic) zurück.
>
> **Behoben**
> - Der `OpcClient` wählt keinen Endpunkt mit unbekanntem Sicherheitsalgorithmus mehr aus (wodurch die Verbindung fehlschlagen würde), wenn Standardeinstellungen verwendet werden und mindestens ein Endpunkt mit bekanntem Sicherheitsalgorithmus verfügbar ist.
> - Problem, durch das `OpcNode.Id` zu einer anderen Objektinstanz wechselte, wenn ein Client das Attribut NodeId eines Nodes las.
> - Problem, bei dem in der `DataTypeId` eines strukturierten Datentyps, der auf einen anderen strukturierten Datentyp verweist, ein ungültiger Namespace-Index angegeben wurde.
> - `OpcNodeManager.GetNode(string)` findet jetzt auch untergeordnete Nodes, die in einem anderen Namespace existieren (solange die Namespaces von derselben Instanz von `OpcNodeManager` verwaltet werden).
> - Ungültig generiertes Längenfeld für Arrays im Attribut DataTypeDefinition.
> - Speicherleck im `OpcServer`, das jedes Mal auftrat, wenn ein Client eine GetEndpoints-Anfrage sendete.
> - Workaround für einige OPC Classic Server hinzugefügt, die das Lesen bestimmter Eigenschaften zusammen mit anderen, regulären Eigenschaften nicht unterstützen.

### 2.41

> **2.41.1.0 (freigegeben am 18.01.2024)**
>
> **Geändert**
> - Die Abhängigkeit `Microsoft.AspNetCore.Server.Kestrel.Core` wurde auf Version 2.1.25 aktualisiert, um eine Sicherheitslücke zu beheben.
>
> **Behoben**
> - Problem, das ein Speicherleck im `OpcClient` verursachte, wenn `OpcClient.BrowseNodes()` wiederholt aufgerufen oder mit den Klassen `OpcFileMethods`, `OpcFileStream` oder `OpcFileInfo` auf Datei-Nodes zugegriffen wurde.
> - Problem, durch das der `OpcClient` fälschlicherweise Leseanfragen (vom Keep-alive-Timer) senden konnte, obwohl der Aufruf von ActivateSession noch nicht abgeschlossen war.

> **2.41.0.0 (freigegeben am 02.12.2023)**
>
> **Geändert**
> - Die Benutzerauthentifizierung im `OpcServer` wird jetzt nur noch einmal während `ActivateSession` durchgeführt, statt für jede Anfrage einzeln.
>
> **Behoben**
> - Problem mit `OpcVariableNodeInfo.IsArray` und `OpcVariableNode.IsArray`, die bei einem Array mit 3 oder mehr Dimensionen fälschlicherweise `false` zurückgaben (Ersteres seit Version 2.33.0).
> - Problem mit einem Deadlock, der beim Aufruf von `OpcClient.Disconnect()` oder `OpcClient.Dispose()` auftrat, während gleichzeitig Ereignis-Subscriptions aktiv waren.
> - Problem, durch das `OpcClient.State` nicht auf `Reconnecting` wechselte, wenn eine Verbindungsunterbrechung erkannt wurde, während eine Operation wie `ReadNodes()` noch ausgeführt wurde.
> - Problem, das die Erstellung eines Ereignisfilters aus einer `OpcNodeId` verhinderte, wenn ein aufgelöster Namespace verwendet wurde.
> - Problem, das ein Speicherleck verursachte, wenn wiederholt Instanzen von `OpcMethodNode` erstellt (und verworfen) wurden und dabei eine Delegate-Instanz übergeben wurde.
> - Problem, durch das reflektierte Typfelder in falscher Reihenfolge deklariert wurden, wenn der Typ eine Schnittstelle implementiert.

### 2.40

> **2.40.0.0 (freigegeben am 23.10.2023)**
>
> **Neu**
> - Neue Methoden `OpcContext.Enter(...)`, um einen lokalen Kontext zu betreten und so Szenarien außerhalb von Client und Server auszuführen.
> - `OpcDataTypeInfo` wurde erweitert, um `ExtensionObjects` auch als Systemtyp zu unterstützen (Eigenschaft `IsSystemType`).
> - Neue Methoden `OpcData.Decode<T>(...)` zur manuellen Dekodierung eines binär kodierten Datenstroms oder Puffers in ein strukturiertes Objekt.
> - Explizite Unterstützung für das Kodieren, Dekodieren und Verwenden von `ExtensionObjects`.
> - Verbesserte Leistung beim erstmaligen Empfang benutzerdefinierter Ereignisdaten.
> - Neue Methode `OpcNodeSet.Load(string, OpcNodeSetLoadOptions)`, um mehr Details zur zu ladenden NodeSet-Datei anzugeben.
>
> **Behoben**
> - Problem mit falsch berechneter Kodierungsmaske bei Verwendung expliziter Kodierung.
> - Problem beim Kodieren und Dekodieren von Subtypen eingebauter Datentypen entsprechend ihren Basistypen.
> - Probleme beim Kodieren und Dekodieren von `ExtensionObjects` in benutzerdefinierten strukturierten Datentypen.
> - Problem mit verschachtelten Ereignistyp-Feldern wie ActiveState/Id, die seit Version 2.32.0 nicht korrekt gemeldet werden.
> - Problem mit gemischten Datentypen, die mit `DataTypeDescriptions` und `DataTypeDefinitions` definiert werden, wobei die Definitionen unterschiedliche Feldtypen verwenden. Die Beschreibungen werden jetzt priorisiert.
> - Problem mit Ereignis-Subscriptions, die seit Version 2.29.0 nicht funktionieren, wenn kein `OpcEventFilter` angegeben wurde.

## 2.30–2.33 (2022–2023)

### 2.33

> **2.33.0.0 (freigegeben am 11.09.2023)**
>
> **Neu**
> - `OpcNodeContext` wurde um die neue Eigenschaft `NodeManager` erweitert, die auf den `OpcNodeManager` im aktuellen Kontext verweist, in dem eine Operation ausgeführt wird.
> - Neue Methode `OpcMethodNode.Call(...)` zum Aufrufen eines implementierten Methoden-Nodes mit einem benutzerdefinierten Kontext, unabhängig von einem Aufruf durch einen Client.
> - Neue Methoden `Close(...)`, `GetPosition(...)`, `Open(...)`, `Read(...)`, `SetPosition(...)` und `Write(...)` zum Aufrufen der implementierten Methoden eines `OpcFileNode` mit einem benutzerdefinierten Kontext, unabhängig von Aufrufen durch einen Client.
> - Verbesserte Leistung bei der Erstellung von Ereignisfiltern, die nur Ereignistypen des vom Server bereitgestellten Node-Typsystems verwenden.
> - Unterstützung von Datentypen, die nur über eine Datentypdefinition und nicht mehr über eine Datentypbeschreibung deklariert werden.
> - Unterstützung der dynamischen Auflösung und Darstellung von Union-Datentypen mit der Klasse `OpcDataObject`.
>
> **Geändert**
> - `OpcContext.Empty.SessionId` liefert keine Null-Referenz (Nothing in Visual Basic) mehr, sondern `OpcNodeId.Null`.
> - Die Zugriffsmodifizierer der Methoden `OpcNodeManager.AddNode(...)` und `OpcNodeManager.RemoveNode(...)` wurden von `protected` auf `public` geändert, um die Verwendung zu vereinfachen.
> - Die Auswertung von `OpcVariableNodeInfo.IsArray` verwendet jetzt den Wert von ValueRank statt ArrayDimensions, um zu entscheiden, ob das Attribut Value ein Array liefert.

### 2.32

> **2.32.0.0 (freigegeben am 28.08.2023)**
>
> **Neu**
> - Weitere DCOM-Sicherheitsoptionen mit Eigenschaften zur Konfiguration von `AuthenticationService`, `AuthorizationService` und `ProxyCapabilities` im Anwendungscode.
> - Neue Eigenschaft `Name` in `OpcDataTypeAttribute`, um für jeden Datentyp einen eigenen Namen zu definieren, den der implementierende .NET-Typ verwendet.
> - Unterstützung für die verzögerte Initialisierung benutzerdefinierter Store-Implementierungen von `OpcData` mit einem Standardkonstruktor.
> - Neue Eigenschaft `IsUnion` in `IOpcDataTypeInfo`, die angibt, ob ein Datentyp ein Union-Datentyp ist.
> - Neue Schnittstelle `IOpcUnion` zur Implementierung benutzerdefinierter Union-Datentypen.
> - Typisierte Unterstützung für den abstrakten Datentyp Number, der die Kodierung aller primitiven numerischen Datentypen unterstützt.
> - Neue Klasse `OpcSubscriptionSetup` für die Erstellung einer neuen Subscription mit allen vordefinierten Eigenschaften.
> - Neue Methode `OpcClient.CreateSubscription(...)`, die ein `OpcSubscriptionSetup` verwendet, um eine neue `OpcSubscription` zu erstellen.
>
> **Behoben**
> - Verweis auf `System.Text.Encodings.Web` 4.5.1 (für das NuGet-Paket) hinzugefügt, um eine Warnung vor einer Sicherheitslücke zu beheben, die durch den transitiven Verweis über `Microsoft.AspNetCore.Server.Kestrel` 2.1.3 beziehungsweise 1.1.3 verursacht wurde.
> - Problem mit Ereignissen, die nicht am Server-Node gemeldet werden, bis ein MonitoredItem erstellt wurde, um das erwartete Ereignis in seiner Node-Hierarchie zu überwachen.
> - Fehlender impliziter Aufruf von `ApplyChanges` mit `OpcEventNode.ReportEvent(...)`.
> - Problem mit der Verwendung des Typbezeichners von BaseEventType in den einfachen Attributoperanden eines `EventFilter`.
> - Problem, durch das gleiche Start- und Endzeiten beim Lesen verarbeiteter History-Werte zu einer Endlosschleife und steigendem Speicherverbrauch führen konnten.
> - Probleme mit Deadlocks bei der Verwendung von `UseDynamic` und Subscriptions mit strukturierten Datentypen, die mit der Klasse `OpcDataObject` dargestellt werden.

### 2.31

> **2.31.0.0 (freigegeben am 17.05.2023)**
>
> **Geändert**
> - Abhängigkeit `Newtonsoft.Json` auf Version 13.0.3 aktualisiert, um eine Sicherheitslücke zu beheben.
> - Der UA Wrapper Server für OPC-Classic-Verbindungen generiert jetzt immer ein neues Anwendungszertifikat, statt zu versuchen, eines aus dem Zertifikatspeicher des Clients zu laden.
> - Wenn bei einer `opc.com:`-URL kein Port angegeben ist, wird der Port für den Classic Wrapper Server nicht mehr von `classID` und `progID` abgeleitet, sondern es wird eine freie dynamische Portnummer ermittelt. Das erleichtert die gleichzeitige Verwendung mehrerer `OpcClients` mit derselben `opc.com:`-URL.
>
> **Behoben**
> - Problem bei der Aktualisierung der `ApplicationUri` des `OpcServer` aus dem ausgewählten Zertifikat: Sie wurde erst beim zweiten statt beim ersten Start angewendet, wodurch der Reconnect-Mechanismus des `OpcClient` fehlschlug.

### 2.30

> **2.30.0.0 (freigegeben am 07.12.2022)**
>
> **Neu**
> - Trace-Protokollierung auf Debug-Ebene bei Verwendung der Unterbrechungsüberwachung mit dem OPC Classic UA Wrapper Server hinzugefügt.
> - Die Eigenschaft `OpcNodeId.Resolution.InheritParentNamespace` wurde eingeführt, um die Vererbung des Namespace von Eltern-Nodes an ihre Kinder zu steuern.
> - Die Auflösung der Standard-NodeId verwendet jetzt den Namespace des Eltern-Nodes (wenn es nicht der Standard-Namespace ist), um die automatische NodeId eines Nodes zu definieren. Das gilt, wenn `OpcNodeId.Resolution.InheritParentNamespace` den Wert `true` hat (der Standardwert).
>
> **Geändert**
> - Das Verhalten beim Starten und Beenden eines OPC Classic UA Wrapper Servers ist jetzt deterministischer, da jeder `OpcClient` einen eigenen Wrapper Server verwendet, der jetzt auch gestoppt wird, wenn der `OpcClient` die Verbindung trennt.
> - Die Methode `OpcCertificateIdentity.Matches()` ist jetzt virtuell, um einen benutzerdefinierten Identitätsvergleich zu ermöglichen.
> - Die Eigenschaft `OpcEvent.EventId` liefert jetzt den zugrunde liegenden ByteString statt eines Byte-Arrays (wie vor der Einführung von ByteString).
>
> **Behoben**
> - Problem mit `ArgumentOutOfRangeException`, die ausgelöst wird, wenn ein `OpcFiniteStateMachineNode` erstellt wird, ohne Zustände über Attribute zu definieren.
> - Problem mit `NullReferenceException`, wenn ein `OpcFiniteStateMachineNode` erstellt wird, nachdem der `OpcServer` bereits gestartet wurde.
> - `OpcEvent.GetValue<T>(string)` gibt jetzt korrekt einen ByteString-Wert zurück, wenn für den Typparameter `T` der Typ `Opc.UaFx.ByteString` verwendet wird.
> - Problem mit `ArgumentException` in `OpcClient.Connect()`, wenn der Anzeigename (Friendly Name) der aktuellen `AppDomain` Zeichen enthält, die in Pfaden nicht zulässig sind (zum Beispiel in einem Office-VSTO-Add-on).

## 2.20–2.29 (2021–2022)

### 2.29

> **2.29.0.0 (freigegeben am 16.09.2022)**
>
> **Neu**
> - Eigenschaft `OpcClientInterfaces.UseBreakMonitoring` hinzugefügt, um den UA Wrapper Server für OPC-Classic-Verbindungen vorübergehend anzuhalten, während ein Verbindungsabbruch (DCOM) zum OPC Classic Server erkannt wird.
> - Neue Methode `OpcNamespace.GetNextId()` zur Abfrage der nächsten freien numerischen `OpcNodeId` aus dem `OpcNamespace`.
> - Eine Reihe neuer Attribute für spezifische Zustände von `OpcStateMachineNode` und deren Übergänge.
> - Neue Klasse `OpcStateNode` zur Darstellung des in OPC UA definierten `StateType`.
> - Neue Klasse `OpcTransitionNode` zur Darstellung des in OPC UA definierten `TransitionType`.
> - Unterstützung für die Konfiguration benutzerdefinierter `OpcFiniteStateMachineNodes` mit den neuen Zustands- und Übergangsattributen, um den Anfangszustand, die Zustands-Nodes und die Übergangs-Nodes mit numerischen oder Enum-Werten festzulegen.
> - Neue Methode `OpcFiniteStateMachineNode.ChangeStateTo()`, um den aktuellen Zustand der `StateMachine` in einen anderen Zustand zu ändern. Die Methode prüft dabei, ob der Zielzustand existiert und ob es einen Übergang vom aktuellen in den neuen Zustand gibt.
>
> **Geändert**
> - `OpcNode.AddNotifier` wird bei anderen Typen als `OpcObjectNodes` und deren Unterklassen nicht mehr unterstützt.
>
> **Behoben**
> - Probleme mit fehlenden Datentypinformationen für den abstrakten Datentyp Structure (`i=22`).
> - Probleme beim Zugriff auf die Eigenschaften `OpcTransitionVariableNode.VariableId/Node`.
> - Probleme beim Zugriff auf die Eigenschaften `OpcFiniteTransitionVariableNode.VariableId/Node`.
> - Probleme beim Zugriff auf die Eigenschaften `OpcStateVariableNode.VariableId/Node`.
> - Probleme beim Zugriff auf die Eigenschaften `OpcFiniteStateVariableNode.VariableId/Node`.

### 2.28

> **2.28.1.0 (freigegeben am 02.09.2022)**
>
> **Neu**
> - Inline-Initialisierung reservierter Felder im Zusammenhang mit Kodierungsmasken mithilfe eines Bit-Arrays.
>
> **Behoben**
> - Problem mit Hostname oder IP-Adresse, die bei der Generierung des Ports für den OPC Classic UA Wrapper Server nicht berücksichtigt wurden.
> - Problem mit dem OPC Classic Client, der weiterhin `IOPCBrowseServerAddressSpace.ChangeBrowsePosition()` mit `OPC_BROWSE_TO` aufrief, obwohl `OpcClient.Interfaces.DataAccess.SupportsBrowseTo` auf `false` gesetzt war.
> - Problem mit falschem ValueRank und falschen ArrayDimensions in Datentypdefinitionen von Strukturen, die ein anderes Feld zur Definition der Länge eines Array-Felds verwenden.

> **2.28.0.0 (freigegeben am 19.08.2022)**
>
> **Neu**
> - Die Inline-Definition von `DataTypeDictionaryNodes` wurde verbessert, sodass nur noch einer zur Verfügung steht, wenn eine Datentypbeschreibung eines Datentyps veröffentlicht werden soll.
> - Unbekannte (benutzerdefinierte) Datentypen werden jetzt mit den Ereignissen `OpcData.TypeResolve` und `OpcClient.TypeResolve` aufgelöst, unter Verwendung der zugehörigen Kodierungskennung und `OpcNodeId.Null` für die Datentypkennung.
>
> **Geändert**
> - Die Deaktivierung von `OpcAutomatism.UseDynamicTypeRegistration` führte zu einer verzögerten dynamischen Typregistrierung, wenn ein benutzerdefinierter Datentyp manuell registriert wurde.
>
> **Behoben**
> - Problem mit `ArgumentException`, wenn die Eigenschaft `Value` eines `OpcStateVariableNode` oder `OpcFiniteStateVariableNode` geändert wurde.
> - Problem mit `OpcData.TypeResolve`, bei dem die übergebenen Ereignisargumente den Encoding Identifier als Typbezeichner lieferten. Der Encoding Identifier wird jetzt als Teil des Encodings übergeben.
> - Problem, durch das `OpcClient.TypeResolve` nicht für jeden Datentyp aufgerufen wurde.
> - Problem mit nicht kodierten, dynamisch aufgelösten Datentypen.
> - Problem mit fehlender führender Array-Länge, wenn ein Datentyp ein Feld mit fester Länge verwendet.
> - Probleme mit inline registrierten Datentypen, obwohl `OpcAutomatism.UseDynamicTypeRegistration` deaktiviert wurde.
> - Probleme mit Aufzählungen, die in einem anderen `DataTypeDictionary` als die strukturierten Datentypen beschrieben werden, wenn voll qualifizierte Datentypbezeichner (Wert und Namespace-URI) verwendet werden.
> - Problem beim Import von NodeSets mit Definitionen strukturierter Datentypen ohne explizite Kennung des Basistyps.
> - Problem mit Fehlern beim Laden von Datentypen in einigen Clients von Drittanbietern beim Zugriff auf `DataTypeDictionaries`, die nur Aufzählungen deklarieren.
> - Probleme bei der Auswahl eines Endpunkts über Constraints bei Endpunkten mit `Mode == None`, aber `Algorithm != None`, und beim Fallback, wenn kein anderer Endpunkt verfügbar ist.

### 2.27

> **2.27.0.0 (freigegeben am 27.06.2022)**
>
> **Neu**
> - Neue Eigenschaft `NumberInList` in `OpcOrderedObjectNode`, um die aktuelle Position eines Nodes innerhalb des Servers zu bestimmen.
> - Neues Ereignis `OpcClient.TypeResolve`, um benutzerdefinierte Typen abhängig von client- und sitzungsbezogenen Bedingungen aufzulösen.
> - `OpcDataTypeDictionary.GetType(OpcEncoding)` wurde verbessert und berücksichtigt jetzt Kodierungen ohne erweiterte NodeIds.
> - Neue geschützte statische Methoden `OpcNode.DefineModel` (Shared in Visual Basic) zur Definition Node-Typ-abhängiger Modellierungsregeln für das gesamte Node-Modell.
> - Einführung von `IOpcDataTypeMapper` und seiner Standardimplementierung `OpcDataTypeMapper`.
> - Neue Methode in `OpcData` zur Registrierung, Bestimmung und Aufhebung der Registrierung benutzerdefinierter Datentyp-Mapper.
> - Neue Methoden `OpcDataTypeMapper.Convertible` und `OpcDataType.Delegate`, um einfache benutzerdefinierte Datentyp-Mapper zu erstellen.
>
> **Behoben**
> - Problem mit `OpcPropertyNode<T>`, der nicht zu seinem Eltern-Node hinzugefügt wird, wenn der Typparameter einen benutzerdefinierten Datentyp darstellt.
> - Problem mit `BadNodeIdUnknown` bei EnumStrings, wenn ein benutzerdefinierter Aufzählungstyp mit EnumStrings definiert ist.
> - Problem mit mehrfachen hierarchischen Referenzen zwischen Eltern- und Kind-Nodes, wenn für einen Kind-Node ein Subtyp des Standardreferenztyps verwendet wird.
> - Regression bei der Erweiterung der Überladungen von `IOpcNodeInfo.Child` und deren Implementierungen.

### 2.26

> **2.26.0.1 (freigegeben am 13.04.2022)**
>
> **Behoben**
> - Regression, die das Ableiten benutzerdefinierter Datentypen ohne Datentypattribute verhinderte.

> **2.26.0.0 (freigegeben am 13.04.2022)**
>
> **Neu**
> - Das `OpcDataTypeAttribute` ermöglicht jetzt festzulegen, welche Datentypen über Datentypdefinitionen, über Datentypbeschreibungen oder über beides deklariert werden.
> - Neue Eigenschaft `Declarations` in `OpcDataTypeInfo`, die angibt, auf welche Weise der Datentyp deklariert wurde.
> - Unterstützung für Arrays von Bit-Membern zur Definition der Kodierungsbits, sodass nicht mehr nur skalare Kodierungsbit-Member verwendet werden können.
> - OPC Watch bietet jetzt eine Upload-Schaltfläche, um eine Datei in einen Datei-Node zu schreiben (der vorhandene Dateiinhalt wird vorher verworfen).
> - Neue Eigenschaft `OpcNodeId.Resolution` zur Konfiguration, wie NodeIds aufgelöst werden, wenn keine benutzerdefinierten NodeIds verwendet werden.
> - Neue Ereignisse `BeforeAdd` und `AfterAdd` in `OpcNode` zur Behandlung von Bedingungen und Zuständen zu dem Zeitpunkt, zu dem ein Node zum Adressraum des Servers hinzugefügt wird oder wurde.
> - Neue Methode `OpcNode.Implement`, um die Erstellung des Nodes abzuschließen, bevor er zum ersten Mal verwendet wird.
> - Unterstützung der Implementierung von Standardschnittstellen aus OPC UA.
> - Einführung von `OpcOrderedObjectListNode` als Standardimplementierung des `OrderedListType`.
> - Einführung des abstrakten `OpcOrderedObjectNode` als Standardimplementierung von `IOrderedObjectType` und `IOpcOrderedObjectNode`.
>
> **Behoben**
> - Problem mit nicht beachteten NodeIds benutzerdefinierter Datentypkodierungen.
> - Problem mit zwischengespeicherten Anwendungszertifikaten, die einen benutzerdefinierten Pfad für den Anwendungsspeicher verwenden.

### 2.25

> **2.25.0.0 (freigegeben am 22.03.2022)**
>
> **Neu**
> - OPC UA Stack Types auf Version 1.04.368 aktualisiert.
> - Die vom Server definierten Datentyp-Nodes liefern im Fall eines opaken Datentyps keine Datentypdefinition mehr. Jede Leseanforderung führt zu `BadAttributeIdInvalid`, das Verhalten entspricht damit dem der eingebauten opaken Datentyp-Nodes.
> - Einführung von `IOpcData<T>`, um Datentypen ableiten zu können, die programmatisch nicht vererbbar sind.
> - Verschiedene Verbesserungen bei der Verarbeitung von Metadaten zu Datentypen, um die Leistung von Kodierungs- und Dekodierungsoperationen zu verbessern.
> - Neue Eigenschaften im Umfeld von `OpcClientSecurity` zur Konfiguration des `AuthenticationLevel` und `ImpersonationLevel`, die der Client bei der Verbindung mit einem OPC Classic Server verwenden soll.
>
> **Geändert**
> - Standardgröße der (automatischen) Kodierungsmaske von einem Bit auf 32 Bit geändert, um die Verwendung der standardmäßig erwarteten 32-Bit-Kodierungsmaske zu vereinfachen.
>
> **Behoben**
> - Problem mit der (automatisch) verwendeten Bitnummer, wenn ein Member eines Datentyps mit `OpcDataTypeMemberSwitchAttribute` als optional gekennzeichnet ist.
> - Problem beim erneuten Laden des Datentypsystems des Servers, nachdem eine Verbindung verloren und wiederhergestellt wurde.

### 2.24

> **2.24.0.0 (freigegeben am 09.03.2022)**
>
> **Neu**
> - Neue Schnittstelle `IOpcAsyncMethodCommand` zur Implementierung asynchroner Befehle.
> - Neue Methode `OpcMethodCommands.Execute` zur Bereitstellung einer benutzerdefinierten generischen Befehlsmethode, die mit einem Befehlsobjekt ausgeführt werden kann.
> - Neue Methode `OpcMethodCommands.ExecuteAsync` zur Bereitstellung einer benutzerdefinierten generischen Befehlsmethode, die asynchron mit einem Befehlsobjekt ausgeführt werden kann.
> - Unterstützung von `IOpcAsyncMethodCommand` und Delegaten, die auf eine Methode verweisen, die einen `Task` oder `Task<T>` zurückgibt. Beide werden beim Methodenaufruf asynchron ausgeführt.
> - Neue Eigenschaft `OpcAutomatism.UseAsyncMethodCalls` zur globalen Steuerung der Ausführung von Methodenaufrufen für jeden Server und alle seine Node-Manager.
> - Neue Eigenschaft `OpcNodeManager.UseAsyncMethodCalls` zur lokalen Steuerung der Ausführung von Methodenaufrufen der vom Node-Manager definierten Methoden.
> - Unterstützung für `NumericRange`-Informationen aus OPC UA mit der neuen Struktur `OpcRange`.
> - `OpcReadNode` wurde um die neue Eigenschaft `Range` erweitert, um das Lesen eines Bereichs von Elementen in einem Attribut zu unterstützen.
> - `OpcWriteNode` wurde um die neue Eigenschaft `Range` erweitert, um das Schreiben eines Bereichs von Elementen in einem Attribut zu unterstützen.
> - Zusätzliche Überladungen der Methode `OpcClient.ReadNode`, um eine `OpcRange` zum Lesen eines Bereichs von Elementen in einem Attribut anzugeben.
> - Zusätzliche Überladungen der Methode `OpcClient.WriteNode`, um eine `OpcRange` zum Schreiben eines Bereichs von Elementen in einem Attribut anzugeben.
>
> **Geändert**
> - Die Eigenschaft `OpcNodeAccessToken.IndexRange` ist jetzt veraltet. Verwenden Sie stattdessen die neue Eigenschaft `OpcNodeAccessToken.Range`.
> - Der Typ der Eigenschaft `OpcReadVariableValueContext(<T>).Range` wurde von `Ua.NumericRange` in `OpcRange` geändert.
> - Der Typ der Eigenschaft `OpcWriteVariableValueContext(<T>).Range` wurde von `Ua.NumericRange` in `OpcRange` geändert.
> - Der Typ der Eigenschaft `OpcReadPropertyValueContext(<T>).Range` wurde von `Ua.NumericRange` in `OpcRange` geändert.
> - Der Typ der Eigenschaft `OpcWritePropertyValueContext(<T>).Range` wurde von `Ua.NumericRange` in `OpcRange` geändert.
>
> **Behoben**
> - Probleme mit dem strikten `XmlReflectionImporter`, der in Mono und Xamarin beim Mappen von Klasseninformationen (einschließlich erwarteter Attribute und Eigenschaftstypen) verwendet wird.

### 2.23

> **2.23.0.0 (freigegeben am 02.03.2022)**
>
> **Neu**
> - Neue Eigenschaft `Tag` in `OpcServiceCommand` zur Zuweisung benutzerdefinierter Metadaten, die an einen bestimmten Befehl gebunden sind.
> - Neue Methoden `Load`, `Parse` und `TryParse` für `OpcDataTypeDictionary`, um ein XML-serialisiertes Dictionary von Datentypen auf verschiedene Weise einzulesen.
> - Überarbeitung von `OpcReadHistoryDetails`, `OpcReadNodeHistoryDetails`, `OpcReadNodeHistoryRawDetails` und `OpcReadNodeHistoryModifiedDetails`.
> - Fehlende Dokumentation zu `OpcReadHistoryDetails`, `OpcReadNodeHistoryDetails`, `OpcReadNodeHistoryRawDetails` und `OpcReadNodeHistoryModifiedDetails` hinzugefügt.
> - Neue Eigenschaft `ReturnBounds` in `OpcReadNodeHistoryDetails`.
> - Neue Methoden `ReadNode`[s]History[Modified] in `OpcClient`, um benutzerdefinierte `OpcReadHistoryDetails` zu unterstützen.
>
> **Behoben**
> - OPC-Classic-Verbindungen geben jetzt `RPC_C_AUTHN_LEVEL_PKT_INTEGRITY` für DCOM an, um die Härtungsänderungen für CVE-2021-26414 zu berücksichtigen.

### 2.22

> **2.22.0.1 (freigegeben am 25.02.2022)**
>
> **Behoben**
> - Problem beim Aufruf von `Acknowledge`, `Confirm` und `AddComment` auf Instanzen von `OpcCondition` und `OpcAcknowledgeableCondition`.

> **2.22.0.0 (freigegeben am 11.02.2022)**
>
> **Neu**
> - Neue Methode `CreateArray` in `OpcArrayDimensions`.
> - Neue Methoden `GetDataType` in `OpcContext`, um kontextabhängige Datentypinformationen zu ermitteln.
> - Unterstützung von `OpcModelChangeEvent`[Node] und `OpcGeneralModelChangeEvent`[Node] einschließlich der zugehörigen `OpcModelChangeItem` und `OpcModelChangeActions`.
> - Benutzerdefinierte Veröffentlichung und Behandlung von Modelländerungsereignissen mit den neuen Klassen `OpcModelChangeEventNode` und `OpcGeneralModelChangeEventNode`.
> - Inline-Komprimierung von Modelländerungsereignissen, wenn ein Ereignis-Snapshot eines `OpcGeneralModelChangeEventNode` bereitgestellt werden soll.
>
> **Behoben**
> - Problem mit falscher Definition des `ValueRank` bei Verwendung des Konstruktors von `OpcArguments`, der benutzerdefinierte Array-Dimensionen akzeptiert.
> - Problem mit der neuen DataTypeDefinition, wenn ein benutzerdefinierter Aufzählungstyp definiert wird, bevor er zum ersten Mal verwendet wird.

### 2.21

> **2.21.0.0 (freigegeben am 01.02.2022)**
>
> **Neu**
> - Client-API: Vorbereitung der zu OPC UA 1.04 kompatiblen Unterstützung von Datentypdefinitionen über das neue Attribut DataTypeDefinition für Datentyp-Nodes. Diese Erweiterung ist abwärtskompatibel zu OPC UA 1.03, da `DataTypeDictionaries` und `DataTypeDescriptions` einschließlich der `DataTypeEncodings` weiterhin zur Bestimmung der deklarierten und beschriebenen Datentypinformationen verwendet werden.
> - Server-API: Einführung der zu OPC UA 1.04 kompatiblen Unterstützung von Datentypdefinitionen über das neue Attribut DataTypeDefinition für Datentyp-Nodes. Diese Erweiterung ist abwärtskompatibel zu OPC UA 1.03, da `DataTypeDictionaries` und `DataTypeDescriptions` einschließlich der `DataTypeEncodings` weiterhin zur Deklaration und Beschreibung eines Datentyps verwendet werden.

### 2.20

> **2.20.4.0 (freigegeben am 14.01.2022)**
>
> **Neu**
> - Clients werden jetzt mit dem Statuscode `BadNodeIdUnknown` benachrichtigt, wenn ein abonnierter Node später gelöscht wird.

> **2.20.3.0 (freigegeben am 04.01.2022)**
>
> **Behoben**
> - Problem mit `OpcNamespace.Resolve()`, durch das `OpcNamespaceCollection.ResolveValue()` nicht richtig funktionierte.
> - `IndexOutOfRangeException`, wenn ein nicht generischer `OpcAnalogItemNode` im Server verwendet wird.
> - Problem mit `StackOverflowException`, wenn (implizit) ein `Byte[]` als Null-Verweis in einen ByteString konvertiert wird.

> **2.20.2.0 (freigegeben am 20.10.2021)**
>
> **Behoben**
> - Problem mit doppelter Nennung von Fehlern in `OpcException.Message`.
> - Problem mit `OpcMethodNode` bei Verwendung des falschen Callback-Ziels.

> **2.20.1.0 (freigegeben am 08.10.2021)**
>
> **Neu**
> - Neues `OpcEnumAttribute`, um die Definition von Enum-Membern zu steuern und festzulegen, ob für diese EnumStrings oder EnumValues verwendet werden. Zusätzlich bietet das `OpcEnumAttribute` Eigenschaften, um die bestehenden Automatismen je Enumeration festzulegen.
>
> **Behoben**
> - Problem beim Verbinden mit Servern über `https:`-URLs unter .NET Framework.

> **2.20.0.0 (freigegeben am 17.09.2021)**
>
> **Neu**
> - `OpcClient` liefert jetzt Informationen zum Node-Typ für Ereignis-, Objekt- und Variablentypen.
> - `OpcNode` bietet die neuen Methoden `RegisterType` und `UnregisterType`, um benutzerdefinierte Node-Typen zu verwalten.
> - `OpcNode` bietet die neuen Methoden `GetType` und `GetTypeInfo` zur Ermittlung von Instanzen von `System.Type` und `OpcNodeTypeInfo`, die einen Node-Typ definieren oder beschreiben.
> - `OpcInstanceNode` bietet die neuen Methoden `GetNodeValue` und `SetNodeValue` zum Ändern des Wertattributs eines bestimmten `OpcVariableNode`, der ein Kind des Instanz-Nodes ist.
> - Das Ableiten von `OpcObjectNode` zur Definition eines benutzerdefinierten Node-Typs führt auch zu inline erstellten Eigenschafts- und Variablen-Nodes für die in der Unterklasse definierten Eigenschaften und Felder.
> - Unterklassen von `OpcTypeNode` zur Definition benutzerdefinierter Node-Typen (`OpcNodeType` und `OpcNodeType<T>`).
> - Neue Attribute zur Beschreibung benutzerdefinierter Node-Typen (`OpcNodeTypeAttribute`, `OpcNodeTypeIgnoreMemberAttribute`, `OpcNodeTypeMemberAttribute`, `OpcNodeTypeOptionalMemberAttribute`).
> - Die Klasse `OpcNodeTypeSystem` wurde erweitert, um Informationen über aktuelle und Standard-Node-Typen des Systems bereitzustellen.
> - Neue Eigenschaften und Methoden in `OpcNodeTypeInfo`, um zusätzliche Informationen über den Typ und seine Kind-Nodes bereitzustellen.
> - Die Datentypauflösung von `OpcArgument` wurde erweitert, um auch spät initialisierte benutzerdefinierte Datentypen zu unterstützen.
>
> **Geändert**
> - `OpcInstanceNode` bestimmt jetzt seine `DefaultTypeDefinitionId` anhand des Node-Typs, der zum Erstellen des Instanz-Nodes verwendet wird.
> - `OpcMemberOrigins` definiert jetzt ein zusätzliches Enum-Member `Method` für Methoden.
>
> **Behoben**
> - Problem mit spät definierten benutzerdefinierten Datentypen, die für Argumente in `OpcMethodNodes` verwendet werden.
> - Problem mit `BadNodeIdUnknown` beim Zugriff auf die InputArguments und OutputArguments von `OpcMethodNodes`, die erstellt wurden, bevor der zugehörige `OpcNamespace` initialisiert und im Server definiert wurde (zum Beispiel bevor `OpcNodeManager.CreateNodes` ausgeführt wurde).

## 2.10–2.19 (2020–2021)

### 2.19

> **2.19.2.0 (freigegeben am 10.09.2021)**
>
> **Neu**
> - Unterstützung von `IEnumerable<OpcName>` in `OpcNamePath`.
> - Neue Methoden `OpcClient.GetType`(s), um alle mit einer NodeId verbundenen Typinformationen zu ermitteln.
> - Neue Methode `OpcClient.IsSubtypeOf`, um festzustellen, ob ein Typ ein Subtyp eines anderen Typs ist.
> - Neue Methode `IOpcNodeInfo.Child(OpcNamePath)`, um einen Kind-Node über einen Pfad von `BrowseNames` zu ermitteln.
> - Neue Eigenschaft `ServiceName` in `OpcServiceRequest` und `OpcServiceResponse`.
> - Neue Methoden `GetResults` und `GetResultExceptions` in `OpcServiceResponse`, um anfrage- und befehlsbezogene Ausnahmeinformationen zu ermitteln.
> - Neues Ereignis `OpcServer.RequestJudgement` zur Behandlung von Problemen mit Anfragen. Darüber lässt sich entscheiden, ob eine Beanstandung verworfen wird. So lässt sich zum Beispiel eine veraltete Anfrage (`BadInvalidTimestamp`) über die Eigenschaft `Dismiss` doch zulassen.
>
> **Geändert**
> - Unnötige Zeilenumbrüche in der String-Darstellung von Instanzen von `OpcException` wurden entfernt.
>
> **Behoben**
> - Irreführende Verwendung desselben Basistyps (also des obersten Node-Typs) für den obersten Basistyp bei der Untersuchung der Typhierarchie eines Node-Typs (zum Beispiel war der `BaseType` von `BaseEventType` gleich `BaseEventType`).
> - Mögliche `NullReferenceExceptions` bei Verwendung der Methoden `OpcClient.GetDataType` und `OpcClient.GetNodeType` mit einer Null-Referenz (Nothing in Visual Basic) statt einer gültigen Instanz der Klasse `OpcNodeId`.
> - Problem, durch das zu wenige `HistoryValues` zurückgegeben wurden, wenn der Server keine Werte, sondern nur einen Fortsetzungspunkt in einer der Antworten gesendet hat.

> **2.19.1.0 (freigegeben am 01.09.2021)**
>
> **Neu**
> - Die neue Methode `GetValue` in der Klasse `OpcEvent` ermöglicht es Unterklassen, den Wert einer Eigenschaft einem Node-Wert des Ereignisses zuzuordnen, ohne den zugehörigen `NamespaceIndex` für einen vollqualifizierten BrowseName zu kennen. Als Index wird dabei der Namespace der Typdefinition verwendet, für die diese Eigenschaft implementiert wird. Die Methode lässt sich auch wie die bekannte Methode `DataStore.Get` verwenden, sodass weiterhin explizit der vollqualifizierte BrowseName übergeben werden kann. Der NamespaceIndex muss beim Zugriff auf Ereignisdaten also nicht mehr bekannt sein.
>
> **Geändert**
> - **Möglicher Bruch:** `IOpcReadOnlyNodeDataStore` erfordert jetzt auch die Implementierung von `IOpcNamespaceResolver`.
>
> **Behoben**
> - Problem mit der Auflösung des zugehörigen benutzerdefinierten Typs beziehungsweise der zugehörigen benutzerdefinierten Instanz von `OpcEvent` für ein benutzerdefiniertes Ereignis, das mit der vollqualifizierten NodeId des Ereignistyps deklariert wurde.
> - Problem mit Hängern bei der Verbindung zu OPC Classic Servern.

> **2.19.0.0 (freigegeben am 27.08.2021)**
>
> **Bruch:** Clients und Server seit Version 2.17.0.0 greifen nicht gemäß der OPC-UA-Spezifikation auf Datei-Nodes zu beziehungsweise stellen diese nicht spezifikationsgemäß bereit. Sie verwenden ein Byte-Array statt ByteString zum Lesen und Schreiben von Dateiinhalten. Dieser Fehler wurde in dieser Version korrigiert.
>
> **Neu**
> - Die Auflösung von Node-Typen und Datentypen wurde verbessert, um auch erweiterte (also aufgelöste) NodeIds zu unterstützen.
>
> **Geändert**
> - **Bruch:** `OpcFileReadMethodNode.FileReadCallback` und `OpcFileReadMethodNode.FileReadExCallback` geben jetzt einen ByteString statt eines Byte-Arrays zurück.
> - **Bruch:** `OpcFileWriteMethodNode.FileWriteCallback` und `OpcFileWriteMethodNode.FileWriteExCallback` akzeptieren jetzt einen ByteString für den Datenparameter statt eines Byte-Arrays.
> - Parameter von `OpcFilterOperand.OfType` von `value : object` in `typeId : OpcNodeId` geändert, um sicherzustellen, dass ein `OfType`-Operand wie erwartet ausgewertet wird (also mit einer `OpcNodeId`).
>
> **Behoben**
> - **Bruch:** Regression beim Zugriff auf `OpcFileNode` mit Lese- und Schreiboperationen, nachdem der Foundation Stack die Verwendung von ByteString für ByteString und `Byte[]` für `Byte[]` erzwingt statt ByteString für `Byte[]`.
> - Problem, durch das keine historischen Werte zurückgegeben wurden, wenn der Server den Statuscode `GoodNoData` mit einem Fortsetzungspunkt meldet.
> - Problem mit endlos zurückgegebenen historischen Werten, wenn der Server die Wiederverwendung von Fortsetzungspunkten erlaubt.

### 2.18

> **2.18.5.0 (freigegeben am 13.08.2021)**
>
> **Neu**
> - Unterstützung der kodierungsbasierten Abfrage von Datentypen über `OpcClient.GetDataType`, zum Beispiel mit `OpcValue.DataTypeId`.
> - Verbesserte Verarbeitung von (strukturierten) Datentypinformationen, um doppelte Datentypdeklarationen zu unterstützen und auf Datentypbeschreibungen umzuleiten, wenn darauf verwiesen wird.
> - Vereinfachte Definition von Eigenschafts-Nodes, ohne den Node manuell zu den Kindern eines übergeordneten Nodes hinzuzufügen.
>
> **Behoben**
> - Regression in Version 2.18.4.0 mit `OpcException` und `BadServerNotConnected` bei aktivierter Option `OpcClient.UseDynamic` während der Verbindung mit einem Server.
> - Probleme mit Siemens OPC UA Servern, die eine benutzerdefinierte Serverschnittstelle mit benutzerdefinierten strukturierten Datentypen verwenden. Diese Lösung erfordert die Option „Aktivierung der Standard-SIMATIC-Serverschnittstelle“, um die Einrichtung der benutzerdefinierten Serverschnittstelle und die verwendeten Datentypen zu unterstützen.

> **2.18.4.0 (freigegeben am 09.08.2021)**
>
> **Neu**
> - Unterstützung kompilierter Delegaten aus `Expression<TDelegate>` in `OpcMethodNodes`.
> - Neuer Indexer mit einem `Int32`, um ein bestimmtes `OpcDataField` in einem `OpcDataObject` zu adressieren.
> - Das Ereignis `OpcClient.SubscriptionsChanged` wird jetzt ausgelöst, wenn `OpcClient.Subscriptions` geleert wird.
> - Veralteter Code, der in .NET 5.0 nicht mehr unterstützt wird, wurde entfernt.
> - Verbesserte Ausnahmebehandlung und Fehlermeldungen beim Import eines `UANodeSet`.
>
> **Behoben**
> - Problem mit spät geladenen benutzerdefinierten Typinformationen, nachdem das Ereignis `OpcClient.Connected` ausgelöst wurde.
> - Problem mit der erweiterten Unterstützung von `byte[]`, durch das die Unterstützung von `sbyte[]` als Wert eines Variablen-Nodes nicht mehr funktionierte (Ursache: .NET unterscheidet bei Mustervergleichen nicht zwischen vorzeichenbehafteten und vorzeichenlosen Typen).
> - Problem beim Schreiben von `Byte[]`-Werten in Variablen-Nodes, da der Stack der Foundation die Verwendung von Variant erzwingt, um Byte-Arrays als `Byte[]` statt als ByteString zu verarbeiten. Das führte zu falschen Typvalidierungen beim Schreiben eines Variablen-Nodes mit einem Byte-Array als Datentyp oder Wert. Gelöst wurde das durch die Berücksichtigung des nachfolgenden Stack-Codes.

> **2.18.3.0 (freigegeben am 28.06.2021)**
>
> **Neu**
> - Erweiterte Ausnahmedetails über die inneren Ausnahmen sowie über Aggregate-Exceptions, um bei Verbindungsproblemen mit OPC Classic weitere Informationen bereitzustellen, wenn der OPC Classic Wrapper Server im selben Prozess ausgeführt wird.
> - Weitere Optionen für `OpcNodeIdComparison`: `IgnoreNamespaceIndex` und `IgnoreNamespaceIndexIgnoreCase`.
>
> **Geändert**
> - `OpcClassicDiscoveryClient` verwendet jetzt die `OpcException`, um stackbezogene Ausnahmen bereitzustellen.
>
> **Behoben**
> - Probleme mit der `OpcServerInfo`, wenn das SDK in einer Umgebung mit „Bundled Assemblies“ verwendet wird.
> - Probleme beim Verbinden mit OPC Classic Servern, die auf einem anderen Rechner ausgeführt werden.
> - Probleme mit fehlenden Nodes beim Browsen von OPC Classic Servern mit flacher Organisation der Nodes.
> - Probleme bei der Übertragung von Byte-Arrays an Methoden-Nodes aufgrund der Logik des Foundation-Stacks, Byte-Arrays standardmäßig als `ByteStrings` zu übertragen.

> **2.18.2.0 (freigegeben am 17.06.2021)**
>
> **Neu**
> - Neue Methoden `Translate` in `OpcServerGlobalization`, die Mechanismen zur Lokalisierung benutzerdefinierter Ressourcen bereitstellen.
> - Unterstützung von Enum-Arrays, die im OPC Stack 1.03 fehlte.
> - Methoden `OpcNodeId.Equals`, mit denen sich NodeIds anhand vordefinierter Vergleichsmethoden über `OpcNodeIdComparison` benutzerdefiniert vergleichen lassen.
>
> **Geändert**
> - `OpcNodeId` vergleicht NodeIds jetzt gemäß der OPC-UA-Spezifikation unter Berücksichtigung der Groß- und Kleinschreibung von Identifier und Namespace.
>
> **Behoben**
> - Problem mit fehlenden bevorzugten Gebietsschemata in `OpcSession` nach dem Aktivieren einer Sitzung. Die Gebietsschemata wurden nur intern aktualisiert und verwendet.
> - Probleme mit Ausnahmen vom Typ ServerHalted beim Zugriff auf Eigenschaften einer Instanz der Klasse `OpcServer` vor dem Start der Instanz.

> **2.18.1.0 (freigegeben am 02.06.2021)**
>
> **Neu**
> - Der fehlende Setter der Eigenschaft `OpcBrowseNode.Degree` wurde hinzugefügt.
> - Neue Eigenschaft `OpcClient.Interfaces` zur Konfiguration der Kommunikation über die OPC-Classic-Schnittstellen.
> - Die neue Klasse `OpcClassicDataAccessOptions` stellt Optionen bereit, um die Art der Organisation des Servers festzulegen und ob der Server den BrowseTo-Dienst unterstützt.
>
> **Behoben**
> - Problem unter Mono beim Verbinden mit einem OPC UA Server, der kein Zertifikat bereitstellt.
> - Problem mit fehlenden Subscription-basierten Benachrichtigungen nach einem automatischen Wiederaufbau der Verbindung.
> - Problem bei der Verwendung eines Byte-Arrays in einem `OpcValue`, das vom zugrunde liegenden Stack als ByteString statt als Byte-Array kodiert wurde.
> - Problem bei der Kodierung des Attributs Value bei nicht generischen `OpcVariableNodes`, wenn ein Array von ByteString-Werten verwendet wird.

> **2.18.0.0 (freigegeben am 26.05.2021)**
>
> **Neu**
> - Verbesserungen für Szenarien, in denen `Byte[]`, ByteString und `ByteString[]` oder einzelne davon als Datentyp von Methodenargumenten oder Variablen-Nodes verwendet werden.
> - Unterstützung der Eigenschaft `OpcDataTypeInfo.Documentation` anhand des Attributs `OpcDataTypeNode.Description`.
> - Die neuen Methoden `OpcReferenceTypes.GetReferenceTypeName(OpcNodeId)` und `GetReferenceType(OpcName)` wurden eingeführt.
> - Vollständige Überarbeitung und Erweiterung der Typen `OpcRelativePath` und `OpcRelativePathElement`.
> - Unterstützung der Übersetzung von Browse-Pfaden mit dem Dienst `TranslateBrowsePath`.
> - `OpcClient` unterstützt jetzt die Übersetzung von Browse-Pfaden über die neuen Methoden `TranslatePath` und `TranslatePaths`.
>
> **Geändert**
> - Das Format von ByteString wurde von Base64-basierter Kodierung in hexadezimale Formatierung (`X2`) geändert, um der binär kodierten Darstellung eines `ByteString` der Foundation zu entsprechen.
>
> **Behoben**
> - Falsch initialisierte Attribute ArrayDimensions und ValueRank von Methodenargumenten und Variablen-Nodes, die `Byte[]`, ByteString oder `ByteString[]` oder einen davon als Datentyp verwenden.
> - Falsche Initialwerte von DataTypeDictionary-Nodes bezüglich der verwendeten Attribute ArrayDimensions und ValueRank nach Einführung des neuen expliziten Datentyps ByteString.
> - Eine vermeidbare `NullReferenceException` beim Initialisieren benutzerdefinierter Datentypen wird nicht mehr ausgelöst.
> - Probleme mit falsch bestimmten Metadaten von `OpcArgument`, die zum Definieren Array-basierter Methodenargumente verwendet werden.
> - Probleme bei der Untersuchung von Informationen zu `System.Type` bei `out`-Parametern, die als By-Reference-Parameter im Delegaten eines Methoden-Nodes verwendet werden.
> - Probleme beim Import von Referenzen aus UANodeSets, wenn diese über Aliase definiert werden.
> - Problem mit fehlenden Typinformationen bei der Untersuchung von Feldern benutzerdefinierter Datentypen, die vom Typ eines Arrays sind. Dabei fehlte die `TypeId` des Elementtyps im `ArrayType` des Felds.
> - Probleme in Anwendungen mit Komponenten von Drittanbietern, die Attribute verwenden, die nicht ladbar sind. Das behebt bekannte `TypeLoadExceptions`, die bei der Untersuchung benutzerdefinierter Datentypen und Ereignistypen auftreten konnten.

### 2.17

> **2.17.0.0 (freigegeben am 04.05.2021)**
>
> **Neu**
> - Unterstützung für benutzerdefinierte Implementierungen der Klasse `OpcFileInfo`.
> - Erweiterung des `OpcMethodContexts` um einen Verweis auf den Owner, um Zugriff auf die zugrunde liegende Instanz von `OpcServer` zu erhalten.
> - Erweiterung der Kodierung zur Unterstützung strukturierter Datentypen anhand ihrer Basistypinformationen.
> - Unterstützung von Null-Referenzen bei Verwendung von `OpcNamespace.Create`.
> - Einführung des expliziten Datentyps ByteString, um die Unterscheidung zwischen Byte-Array- und ByteString-Werten zu erleichtern.
>
> **Behoben**
> - Problem mit Servern, die Null-Referenzen als Teil ihres `NamespaceArrays` verwenden.
> - Problem mit zurückgesetzter `OpcNode.Description`, zum Beispiel bei `OpcDataVariableNode<T>` mit einem benutzerdefinierten Datentyp.
> - Problem mit nicht initialisierten Ereignis-Nodes bei Verwendung außerhalb eines Adressraums, zum Beispiel bei leichtgewichtigen Ereignissen.
> - Problem mit der automatischen Firewall-Awareness und den dabei verwendeten DNS-sicheren Hostnamen. Um in diesem Fall eine neue Sitzung zu erstellen, wird jetzt die über Discovery ermittelte unveränderte Endpunkt-URL verwendet.
> - Problem mit `TypeInitializationException` bei der Prüfung auf Verwendung der Unity-Runtime in manchen Szenarien mit dynamisch geladenen Assemblies.
> - Problem mit `InvalidOperationException` im `BufferManager` der Foundation, wenn ein gesperrter Puffer freigegeben werden soll, der zuvor nicht entsperrt wurde.
> - Problem mit nicht aufgelösten Datentypinformationen in Argumenten von Methoden-Nodes, wenn erweiterte NodeIds für den Datentyp verwendet werden.
> - Problem mit nicht aufgelöster Datentyp-Kodierung im Typsystem des Servers, wenn erweiterte NodeIds für die Datentyp-Kodierung verwendet werden.
> - Problem beim Vergleich erweiterter NodeIds mit demselben Identifier, aber unterschiedlichen Namespaces.
> - Problem beim Ermitteln von Typinformationen benutzerdefinierter Datentypen mit denselben Namen, aber in unterschiedlichen Namespaces.
> - Problem mit `NullReferenceExceptions` beim Versuch, eine Ressource zu übersetzen, ohne zuvor Ressourceninformationen hinterlegt zu haben.
> - Problem mit fehlenden benutzerdefinierten Datentypen, wenn diese über mehrere (dynamische) Node-Manager definiert werden.
> - Problem mit der Vererbung des Standard-ReferenceTypes bei Verwendung von `OpcFolderNodes`. Dadurch wurde der Standard-ReferenceType Organizes nach einem Stack-Update nicht mehr für die direkten Kind-Nodes übernommen.
> - Weiterführendes Problem bei der Deklaration und Verwendung von Variablen-Nodes mit ExpandedNodeIds oder NodeIds als Datentypen.
> - Threading-Problem beim asynchronen Start mehrerer Instanzen von `OpcServer`.
> - Falscher Wert des Attributs ArrayDimensions der Nodes InputArguments und OutputArguments von `OpcMethodNodes`.

### 2.16

> **2.16.1.0 (freigegeben am 21.04.2021)**
>
> **Neu**
> - `OpcNominalNodeIdFactory` wurde erweitert, um zusätzliche benutzerdefinierte Logik auf den verwendeten `OpcName` anzuwenden, anhand dessen die `OpcNodeId` erstellt wird.
>
> **Behoben**
> - Problem mit weiterhin existierenden Instanzen von `OpcSubscription` in `OpcClient.Subscriptions`, obwohl der Client nicht mehr verbunden ist.

> **2.16.0.0 (freigegeben am 20.04.2021)**
>
> **Neu**
> - Unterstützung für benutzerdefinierte Quellen von `OpcFileNode` über die neue Schnittstelle `IOpcFileInfo`.
>
> **Behoben**
> - Problem beim Deklarieren von und Zugreifen auf Variablen-Nodes, die `ExpandedNodeId` als Datentyp verwenden.
> - Problem mit `FileNotFoundExceptions`, wenn Assemblies von Drittanbietern verwendet werden, während die dynamische Typregistrierung aktiviert ist.

### 2.15

> **2.15.0.0 (freigegeben am 31.03.2021)**
>
> **Neu**
> - Neue Eigenschaft `Opc.UaFx.Client.OpcSubscription.Client`, um Zugriff auf den Client zu erhalten, der Besitzer einer Subscription ist.
> - Neue Eigenschaft `OpcServer.Binding.Addresses`, um explizite IP-Adressen der Netzwerkschnittstellen zu binden und auf diesen zu lauschen.
> - Methode `OpcNodeCollection.TryGet`, um zu versuchen, einen Node anhand seiner NodeId zu ermitteln.
> - Methoden `OpcNodeManager.GetNode`, um Nodes anhand ihrer NodeId oder über einen Pfad zu ermitteln. Der Pfad ist eine Folge aus Browse- und Symbolic-Names der Nodes auf dem Weg zum Node, jeweils getrennt durch einen Schrägstrich (`/`).
>
> **Behoben**
> - Problem beim Erstellen von Eigenschafts-Nodes ohne Eltern-Node.

### 2.14

> **2.14.0.0 (freigegeben am 04.03.2021)**
>
> **Neu**
> - Neue statische Methode `OpcName.IsNullOrEmpty`, die bei der Auswertung die Namespace-Informationen des `OpcNames` ignoriert.
> - Neue statische Methode `OpcNodeId.IsNullOrEmpty`, die bei der Auswertung die Namespace-Informationen der `OpcNodeIds` ignoriert.
> - Neue Methode `OpcNamespace.GetId(object)`, um NodeIds zu ermitteln, ohne den Typ des Werts zu kennen.
> - Dynamische Auflösung von Datentypinformationen, ohne diese zuvor dem Datentypsystem mitzuteilen (also zu registrieren).
> - Zusätzliche nicht generische Methoden `OpcData.RegisterType`, sodass die Methoden mit generischem Typparameter nicht mehr verwendet werden müssen.
> - Neue Methoden `OpcDataTypeNode.Create(...)`, um Instanzen von `OpcDataTypeNodes` auf nicht generischem Weg zu erstellen.
>
> **Geändert**
> - Doppelte Verweise auf `DataTypeNodes` bei Verwendung der Klasse `OpcAddressSpace` wurden entfernt.
>
> **Behoben**
> - Problem mit fehlerhaften oder zu vielen Subscriptions, das den `OpcClient` daran hinderte, sich nach Verlust einer Verbindung automatisch neu zu verbinden.
> - Problem mit inline initialisierten `OpcDataTypeNodes` bei Verwendung der dynamischen Auflösung von Datentypinformationen.
> - Problem mit fehlenden Typreferenzen bei benutzerdefinierten Enumerationen im globalen Datentypsystem.

### 2.13

> **2.13.0.0 (freigegeben am 01.03.2021)**
>
> **Neu**
> - Verbesserte Auflösung des Attributs DataType mit Unterstützung erweiterter NodeIds.
> - Verbesserte dynamische Kodierung und Dekodierung von Datentypen zur Unterstützung von Unterklassen und kaskadierten benutzerdefinierten strukturierten Datentypen.
> - Das `OpcDataTypeIgnoreMemberAttribute` wurde eingeführt, um Member eines Typs explizit von der Kodierung und Dekodierung auszuschließen.
> - Die Eigenschaften `OpcDataTypeAttribute.NamespaceUri` und `OpcDataTypeAttribute.UseDataTypeDescription` wurden eingeführt, um den Ziel-Namespace des zu verwendenden Data Type Dictionary eines Datentyps zu definieren und festzulegen, ob der Datentyp eine Beschreibung in einem benutzerdefinierten Data Type Dictionary benötigt.
> - Unterstützung benutzerdefinierter Ziel-Namespaces für benutzerdefinierte Enumerationen.
> - Unterstützung eingebetteter benutzerdefinierter Datentypen beim dynamischen Datenaustausch über Container-Typen wie Variant oder `ExtensionObject`.
>
> **Behoben**
> - Problem mit fehlenden Verweisen auf Ziel-Namespaces im inline definierten Data Type Dictionary, wenn der benutzerdefinierte Datentyp ohne Informationen zum Ziel-Namespace definiert wurde.

### 2.12

> **2.12.3.0 (freigegeben am 17.02.2021)**
>
> **Neu**
> - Verbesserte Unterstützung von IL2CPP bezüglich Problemen bei der Auswertung eingebetteter String-Werte.
>
> **Behoben**
> - Probleme bei der Verwendung der Standard-Probing-Pfade für Zertifikate unter Unity mit UWP.
> - Problem beim Aufruf von Methoden-Nodes nach der Einführung der Lokalisierung von Argumenten.

> **2.12.2.0 (freigegeben am 15.02.2021)**
>
> **Neu**
> - Unterstützung der Übersetzung von Argumenten von Methoden-Nodes.
>
> **Behoben**
> - Probleme beim Zugriff auf lokalisierte Informationen mit dem Client bei einer neutralen Kultur.
> - Problem mit Null-Referenzen (Nothing in Visual Basic), wenn lokalisierbare Attribute ohne Übersetzung gelesen werden.

> **2.12.1.0 (freigegeben am 11.02.2021)**
>
> **Neu**
> - Neue Klasse `OpcNodeExportOptions` zur Konfiguration der Informationen, die beim Export von Nodes in ein NodeSet exportiert werden sollen.
> - Überladung der Methode `OpcNodeManager.ExportNodes(OpcNodeExportOptions)` zur Definition benutzerdefinierter Exportoptionen.
> - Einführung der neuen Klasse `OpcNodeGlobalization`, um die Ressourcen zu verwalten, die zur Lokalisierung von Attributen eines bestimmten Nodes verwendet werden sollen.
> - Die Eigenschaften `OpcNode.DisplayNames` und `OpcNode.Descriptions` stellen Instanzen bereit, über die sich die Lokalisierung der lokalisierbaren Attribute eines Nodes je Node steuern lässt.
>
> **Geändert**
> - Bidirektionale Verweise zwischen DataTypeDescription-, DataTypeEncoding- und DataType-Nodes werden jetzt unidirektional exportiert (mit den Standard-Exportoptionen).
>
> **Behoben**
> - Problem mit automatisch ermittelten Serverinformationen anhand prozessbezogener Versionsinformationen, die die Auswertung von `ProductVersion` und `FileVersion` einschlossen.
> - Problem mit dem Überschreiben von `OpcNode.SymbolicName`, wenn ein Node importiert wird, der für die Eigenschaft `SymbolicName` einen anderen Wert verwendet als für das Attribut DisplayName.
> - Problem mit nicht mehr mehrzeilig Base64-kodiertem `DataTypeDictionary` (mit den Standard-Exportoptionen).
> - Problem mit entfernten Attributen `ParentNodeId` in NodeSets (mit den Standard-Exportoptionen).
> - Problem mit umsortierten Nodes (anhand ihrer NodeId) beim Export in ein NodeSet. Ab sofort werden sie in der Reihenfolge ihrer Definition beziehungsweise Implementierung exportiert.
> - Problem mit fehlenden Supertypen beim Import von Nodes, die zuvor in einen Server importiert und wieder exportiert wurden (aufgrund der Neuordnung der Nodes).

> **2.12.0.0 (freigegeben am 04.02.2021)**
>
> **Neu**
> - Neue Eigenschaft `Namespaces` in `IOpcApplicationInstance` und `OpcApplicationInstance`, um die verwendeten Namespaces bereitzustellen.
> - Neue Eigenschaft `Namespaces` im `OpcClient`, um die Namespaces des verbundenen Servers abzubilden.
> - Neue Eigenschaft `Namespaces` im `OpcServer`, um die Namespaces bereitzustellen, die die Node-Manager des Servers zur Organisation des Adressraums verwenden.
> - Neue Eigenschaft `Namespaces` in `OpcContext`, um die im aktuellen Kontext gültigen Namespaces bereitzustellen.
> - Die Schnittstelle `IOpcNamespaceResolver` wurde in der `OpcNamespaceCollection` und `OpcReadOnlyNamespaceCollection` implementiert.
> - Methode `Resolve` in `IOpcNamespaceResolver`, um einen anderen (online) Namespace anhand der Metadaten eines offline beziehungsweise lokal definierten Namespaces aufzulösen.
> - `OpcNamespace` stellt jetzt immer dann eine URI bereit, wenn `OpcNamespace.Value` eine gültige URI darstellt.
> - Verbindungen zu OPC Classic Servern über einen inline verwendeten Wrapper-Server werden jetzt gesichert, indem dieselbe Benutzeridentität verwendet wird, die unter `OpcClient.Security.UserIdentity` eingestellt wurde.
> - `OpcClient` und `OpcClassicDiscoveryClient` unterstützen jetzt die Verwendung einer Hostidentität zur DCOM-Authentifizierung. Hinweis: Beim `OpcClient` wird die unter `OpcClient.Security.UserIdentity` eingestellte Identität ebenfalls zur DCOM-Authentifizierung verwendet.
> - Neue Eigenschaft `Scope` in `OpcNamespace`, die den Kontext beschreibt, in dem der Namespace erstellt wurde und in dem seine Metadaten gelten.
> - Verbesserte Geschwindigkeit bei der Initialisierung von `OpcNodes` während des Starts des `OpcServers`.
> - Die Verwendung von `OpcNodeManager.ctor(OpcNamespace, ...)` mit einem Namespace, der einen expliziten Namespace-Index besitzt, führt zu einer `ArgumentException`, da es Aufgabe des Servers ist, den verwendeten Namespaces den zugehörigen Namespace-Index zuzuweisen.
> - Die Instanzen von `OpcNamespace` im `OpcNodeManager` werden jetzt mit den Instanzen von `OpcNamespace` der neuen Eigenschaft `OpcServer.Namespaces` synchronisiert. In der Startphase des Servers können sich die Instanzen in `OpcNodeManager.Namespaces` deshalb ändern. Spätestens beim Aufruf von Methoden wie `OpcNodeManager.CreateNodes(...)` sind alle `OpcNodeManager.Namespaces` mit den `OpcServer.Namespaces` synchronisiert.
>
> **Geändert**
> - Der Namespace `OpcNamespace.Default` stellt jetzt den zum Standard-Namespace gehörigen Wert sowie die URI bereit, unter der der Namespace der Foundation identifiziert werden kann.
> - Abgekündigte Methoden in `IOpcNamespaceResolver` sowie deren Implementierung in `OpcClient`, `OpcServer`, `OpcContext` und `OpcNodeManager` wurden entfernt.
> - Übergänge von `OpcClient.State` finden nicht mehr statt (bei Verwendung des standardmäßig aktivierten Reconnect-Mechanismus), wenn während eines Wiederverbindungsversuchs zum Beispiel `ReadNode` aufgerufen wird.
> - Bei einer unterbrochenen Verbindung versucht der `OpcClient` (standardmäßig), die Verbindung wiederherzustellen und dabei die zuvor verwendete Sitzung wiederzuverwenden. Wenn die vorherige Sitzung nach dem Wiederaufbau der Verbindung wiederverwendet werden kann, löst der `OpcClient` (wie bisher) das Ereignis `Reconnected` aus. Wenn der Client eine neue Sitzung erstellen muss (zum Beispiel, weil diese abgelaufen ist), löst der `OpcClient` jetzt das Ereignis `Connected` statt `Reconnected` aus. So lassen sich diese Situationen im Benutzercode unterscheiden.
> - Vergleiche von `OpcNodeId` und `OpcNamespace` mit Null-Verweisen verhalten sich jetzt wie bei jeder anderen typischen .NET-API (dieses Verhalten unterscheidet sich von dem des Stacks der Foundation).
>
> **Behoben**
> - Problem mit zusammengefallenen Endpunkt-URLs bei der Discovery von Servern, die zum Beispiel `opc.tcp://:4840` als Endpunkt-URL liefern.
> - Problem mit nicht aufgelösten NodeIds, wenn manuell erstellte MonitoredItems einer Subscription zugewiesen werden.
> - Problem mit überaufgelösten NodeIds: Die Auflösung erzeugt (wie bisher) vollständig neue NodeIds, überschreibt aber nicht mehr wiederholt die Namespace-Informationen der ursprünglichen NodeId.
> - Problem im OPC Classic Stack mit zunehmender Anzahl an Threads (insbesondere in MTA-Anwendungen), sobald die Verbindung zum OPC Classic Server einmal verloren ging.
> - Problem bei der Definition benutzerdefinierter Datentypen, ohne eine explizite NamespaceUri in deren `DataTypeEncoding` festzulegen.
> - Problem mit dem Verlust von Informationen zu `OpcNamespace`, nachdem eine bereits initialisierte NodeId anhand einer NodeId der Foundation erneut initialisiert wird, da sich diese zwischenzeitlich geändert hat.
> - Problem in Anwendungen, in denen mehrere Server oder Client und Server im selben Prozess ausgeführt werden: Die beteiligten Namespaces entsprachen nicht in jedem Fall der jeweiligen Anwendung. Das Problem wurde gelöst, indem weder der Namespace einer existierenden NodeId noch der einer Instanz von `OpcNamespace` indirekt aufgelöst wird. Wenn Sie dieses Verhalten dennoch benötigen, müssen Sie die entsprechende Logik selbst implementieren.

### 2.11

> **2.11.5.0 (freigegeben am 21.12.2020)**
>
> **Neu**
> - Optimierung der verwendeten Aliase in exportierten UA NodeSets (nicht verwendete werden beim Erstellen des UA NodeSets entfernt).
> - Redundante Informationen in den Attributen DisplayName und Description werden jetzt entfernt. Wenn beide Attribute denselben Wert haben, wird das Attribut Description beim Erstellen des UA NodeSets nicht mehr exportiert.
> - Redundante Informationen im Attribut ParentNodeId werden beim Erstellen des UA NodeSets nicht mehr exportiert, wenn der `ParentNode` bereits durch eine Referenz über die `ReferenceTypeId` des Kind-Nodes referenziert wird.
>
> **Behoben**
> - Problem mit `NullReferenceExceptions` im `OpcServer`, wenn ein Client versucht, einen neuen Node anzulegen, und dabei auf einen `ParentNode` mit unbekannter oder ungültiger NodeId verweist.
> - Problem mit fehlenden Node-Verweisen (auf Nodes, die in einem anderen Node-Manager definiert werden) in UA NodeSets beim Export von Nodes, deren NodeId implizit festgelegt wurde.
> - Problem beim Export von Nodes, die über das Attribut ParentNodeId aufeinander verweisen und zwischen denen zugleich ein expliziter Node-Verweis besteht. In solchen Fällen wird jetzt auf die `ParentNodeId` verzichtet, wenn `child.ReferenceTypeId` (die Standardreferenz zwischen Eltern- und Kind-Nodes) der zu beschreibenden Referenz im UA NodeSet entspricht. Der Import des bisher erzeugten UA NodeSets führte zu einem Adressraum mit mehrfachen Verweisen zwischen den Nodes (beschrieben durch das Attribut `ParentNodeId` und die Referenzen).

> **2.11.4.0 (freigegeben am 15.12.2020)**
>
> **Neu**
> - Neue Eigenschaft `OpcContext.Owner`, die auf Instanzen von `IOpcApplicationInstance` wie `OpcClient` oder `OpcServer` verweist, zu denen der Kontext gehört (soweit verfügbar).
> - Neue Eigenschaft `OpcException.Context`, die eine Instanz der Klasse `OpcContext` bereitstellt, über die weitere kontextabhängige Informationen zur ausgelösten beziehungsweise behandelten Ausnahme abgerufen werden können.
>
> **Behoben**
> - Problem bei der Verwendung abstrakter Methoden für Methoden-Nodes (Ursache ist ein Fehler im .NET Framework bei Verwendung der Erweiterungsmethoden `GetCustomAttribute<T>`).

> **2.11.3.1 (freigegeben am 27.11.2020)**
>
> **Behoben**
> - Problem beim Verbinden mit Servern, die bei Endpunkt-URLs Groß- und Kleinschreibung unterscheiden und URLs mit der Endung `/` nicht unterstützen.

> **2.11.3.0 (freigegeben am 23.11.2020)**
>
> **Neu**
> - Fehlende Eigenschaft `OpcEventDataSetItem.ClientID` ergänzt.
> - Fehlende Code-Dokumentation von `OpcSecurityPolicy`, `OpcSecurityMode` und `OpcSecurityAlgorithm` ergänzt.
> - Neue Eigenschaft `PreferredLocales` in `OpcContext`, `OpcOperationContext` und `OpcSession`.
> - Neue Eigenschaften `OpcNode.Read/WriteDisplayNameCallback`.
> - Neue Methode `OpcServer.GetSession(sessionId)` zum Abfragen einer bestimmten Sitzung über deren Session-ID.
> - Neue Eigenschaft `OpcServer.Globalization` zur besseren Bereitstellung lokalisierter Informationen und Daten.
>
> **Geändert**
> - Der Datentyp der Eigenschaften `OpcNode.Read/WriteDescriptionCallback` wurde von `String` auf `OpcText` geändert.
> - `OpcDataChangeDataSetItem.ClientID` von `Int32` in `Int64` geändert, um dem bei `OpcMonitoredItem.ClientID` verwendeten Typ zu entsprechen.
>
> **Behoben**
> - Problem mit fehlender `OpcNotification.Data`, wenn `OpcNotification.GetDataChanges()` verwendet wird, ohne zuvor auf die `OpcNotification.Data` zugegriffen zu haben.
> - Problem bei der Typinitialisierung in `OpcClient` unter Unity mit IL2CPP: Typen wurden in einer abweichenden Reihenfolge initialisiert.

> **2.11.2.0 (freigegeben am 10.11.2020)**
>
> **Neu**
> - Experimentelle Methode `OpcNodeManager.ExportNodes` zur Generierung von Instanzen von `OpcNodeSet` anhand des Adressraums, den Node-Manager definieren. Nutzen Sie die Methode je nach Anwendungsfall und geben Sie uns Feedback bei Problemen oder gewünschten Erweiterungen.
>
> **Behoben**
> - Problem, durch das `OpcClient.Dispose()` hängen bleiben konnte, während noch eine Subscription aktiv ist.
> - Mögliche Ausnahmen beim Aufruf von `OpcClient.Dispose` und `OpcServer.Dispose`.
> - Problem bei der Validierung von Lizenzinformationen unter Verwendung von IL2CPP und .NET Standard 2.0 als Scripting Backend in Unity.
> - Problem, das die korrekte Verwendung eines existierenden `SynchronizationContexts` zur Verarbeitung von Benachrichtigungen in demselben Kontext verhinderte, in dem eine Subscription erstellt wurde.
> - Problem beim Hinzufügen weiterer Node-Referenzen (Verweise wurden nicht korrekt in den Adressraum übernommen).

> **2.11.1.0 (freigegeben am 05.11.2020)**
>
> **Neu**
> - Der `OpcServer` kann jetzt auch gestoppt werden, wenn er pausiert wurde.
> - Eigenschaft zur Konfiguration der `TimestampsToReturn` für alle ReadNodesHistory-Anfragen über `OpcClient.Services.ReadNodesHistory.TimestampsToReturn`.
> - Eigenschaft `OpcCertificateInfo.ApplicationUri` zum Abrufen der `ApplicationUri`, die als Erweiterung „Subject Alternative Name“ in Zertifikaten enthalten ist.
> - Eigenschaft `OpcClientSecurity.AutoUpgradeEndpointPolicy` zum Aktivieren einer Endpunktauswahl, die auf der Übereinstimmung mit der Konfiguration (Standard) und einem Nächstbeste-Verfahren basiert, das einen Endpunkt bestimmt, der mindestens die konfigurierte Policy gewährleistet.
>
> **Geändert**
> - Der Konstruktor von `OpcCertificateJudgementEventArgs` prüft nicht mehr, ob eines der übergebenen Zertifikate eine Null-Referenz (Nothing in Visual Basic) ist, weil manche Server für Endpunkte mit der Policy `None` (Mode und Algorithm) keinerlei Zertifikatdaten verwenden.
>
> **Behoben**
> - Problem mit nicht mehr verfügbaren Benachrichtigungen in Subscriptions und MonitoredItems, wenn diese nicht (mehr) in der aktuellen Sitzung erstellt beziehungsweise aktiv sind.
> - Problem mit fehlenden oder fehlerhaften Security Policies nach dem Neustart von Instanzen von `OpcServer`.

> **2.11.0.0 (freigegeben am 06.10.2020)**
>
> **Neu**
> - Neue Methode `OpcServer.Suspend()`, um den Server in den Status `Suspended` zu versetzen.
> - Neue Methode `OpcServer.Resume()`, um den Server aus dem Status `Suspended` wieder in den Status `Started` zu versetzen.
> - Neue Werte in der Enumeration `OpcServerState`: `Suspending` und `Suspended`.
> - Erweiterung der Methode `OpcSession.Close`, die nicht mehr nur Diagnosedaten verwirft, sondern jetzt tatsächlich die Sitzung schließt.
> - Fehlende Code-Dokumentation für Subscription-bezogene Typen im Client-Namespace.
>
> **Geändert**
> - Die Methode `OpcSession.Close` schließt ab sofort die Sitzung und macht den sitzungsbezogenen Identifier ungültig.
> - Methoden von `OpcClient` validieren ab sofort den Verbindungsstatus mit einer `OpcException` (mit `BadServerNotConnected`) statt einer `InvalidOperationException`.
> - Der Standardwert der Eigenschaft `QueueSize` der Instanz von `OpcMonitoredItem`, die über `OpcClient.SubscribeEvent`(s) erstellt wird, wurde von `int.MaxValue` auf `uint.MaxValue` geändert. So verwendet der Server für die Queue der Ereignisbenachrichtigungen die maximal unterstützte Größe. Das war auch das ursprüngliche Ziel des falschen Werts `int.MaxValue`.
> - Die Eigenschaft `OpcMonitoredItemStatus.DataItemQueueSize` wurde in `QueueSize` umbenannt, um der Benennung der entsprechenden Eigenschaft in der Klasse `OpcMonitoredItem` zu entsprechen. Diese repräsentiert die angeforderte Größe, die Eigenschaft in `OpcMonitoredItemStatus` die revidierte Größe.
> - Der Rückgabetyp der Eigenschaft `OpcMonitoredItemStatus.Id` wurde von `Int32` in `Int64` geändert, damit er den zugrunde liegenden, nicht CLS-konformen `UInt32` des Stacks der Foundation abbilden kann.
> - Die letzten API-Änderungen an `OpcMonitoredItem` wurden auf `OpcMonitoredItemStatus` übertragen: Die Eigenschaft `OpcMonitoredItemStatus.AutoFlushCache` wurde in `QueueMode` umbenannt (wie in der Klasse `OpcMonitoredItem`).
>
> **Behoben**
> - Für Kommunikationsfehler wurde der falsche Statuscode verwendet: Statt `BadNotConnected` wird jetzt `BadCommunicationError` verwendet.
> - Der `OpcClient` verband sich mit einem (möglicherweise unsicheren) Fallback-Endpunkt, wenn eine vordefinierte `SecurityPolicy` vom Server nicht unterstützt wird.
> - Der Wert der Eigenschaft `OpcSubscription.TimestampsToReturn` wurde nicht auf die MonitoredItems der Subscription übernommen, wenn diese nicht zusätzlich geändert wurden.
> - Schreibfehler in der Code-Dokumentation der Methoden `RegisterNode`.

### 2.10

> **2.10.0.3 (freigegeben am 11.09.2020)**
>
> **Behoben**
> - Problem beim Verbinden mit OPC Classic Servern.

> **2.10.0.2 (freigegeben am 09.09.2020)**
>
> **Behoben**
> - Problem beim Vergleichen von `OpcNodeIds`, wenn diese ein Byte-Array als Wert der NodeId verwenden.

> **2.10.0.1 (freigegeben am 15.07.2020)**
>
> **Neu**
> - Beschreibung des NuGet-Pakets aktualisiert.

> **2.10.0.0 (freigegeben am 14.07.2020)**
>
> **Neu**
> - Automatische Initialisierung von Nodes, die über den Dienst `AddNodes` hinzugefügt werden. Das Ergebnis entspricht dem Verhalten beim Hinzufügen von Nodes in einem benutzerdefinierten Node-Manager.
> - Erweiterung der Methode `OpcCertificateManager.SaveCertificate`, die das Format des Zertifikats anhand der Dateierweiterung im Parameter `filePath` ermittelt.
> - Neue Methoden `OpcValueRange.Of`, um die zugehörige `OpcValueRange` für einen bestimmten Datentyp dynamisch zu ermitteln.
> - Nicht generische `OpcAnalogItemNodes` können jetzt auch selbstständig die zugehörigen `OpcValueRanges` für `InstrumentRange` und `EngineeringUnitRange` festlegen (über das Attribut DataType).
> - Unterstützung für die Kodierung und Dekodierung von `System.Decimal` (von OPC UA 1.03 nicht unterstützt) über `System.Double`. Das betrifft Felder von Datenstrukturen.
> - Eigenschaft `ProductUri` in `OpcClient` und `OpcServer` zur einfacheren Konfiguration.
> - Automatische Initialisierung der ProductUri-Information in Client- und Serveranwendungen.
> - Verwendung des aktuell gültigen `SynchronizationContext`, um Benachrichtigungen in demselben Kontext zu verarbeiten, in dem die zugehörige Subscription erstellt wurde.
> - Verbesserungen für GUI-Anwendungen (wie Windows Forms) beim korrekten Multithreading in der Behandlung empfangener Benachrichtigungen.
> - Neue Methoden `OpcNode.UpdateChanges` zur Benachrichtigung über Änderungen an einem Node (und seinen Kind-Nodes).
> - Fehlende Dokumentation für verschiedene Typen ergänzt.
>
> **Geändert**
> - `OpcNode.OnAfterApplyChanges` und `OpcNode.OnBeforeApplyChanges` nutzen jetzt `OpcNodeChangesEventArgs` statt `EventArgs`.
> - `OpcNode.AfterApplyChanges` und `OpcNode.BeforeApplyChanges` übergeben jetzt `OpcNodeChangesEventArgs` statt `EventArgs` an Ereignishandler.
>
> **Behoben**
> - Problem beim Schreiben von `AnalogItemNodes`, die über einen benutzerdefinierten Node-Manager ohne `InstrumentalRange` bereitgestellt werden: Beim Schreiben wurde keine Validierung des Werts durchgeführt.
> - Problem mit nur einmal aktualisiertem `SourceTimestamp` in `OpcValues` (wenn nicht explizit ein `SourceTimestamp` angegeben wurde) beim Schreiben von Variablen.
> - Problem im `OpcNodeHistorian` (bei dessen Zuweisung) beim Import von Nodes aus einem NodeSet mit aktiviertem Attribut Historizing, wenn zugleich die Kind-Nodes `HistoryConfiguration` oder `AggregateConfiguration` fehlten.
> - Problem beim Linken der Assembly in C++-CLR-Projekten mit C++/CLI, das den Fehler C2686 auslöst.
> - Problem mit `NullReferenceExceptions` unter .NET Core 3.1 beim Empfang von Ereignisbenachrichtigungen.
> - Problem mit nicht aufgelösten NodeIds, wenn der NamespaceIndex 1 verwendet wird (der für den Core- beziehungsweise Application-Namespace reserviert ist).

## 2.0–2.9 (2017–2020)

### 2.9

> **2.9.2.1 (freigegeben am 08.05.2020)**
>
> **Behoben**
> - Problem beim Lesen strukturierter Datentypen, die ein Array-Feld enthalten, wenn `OpcClient.UseDynamic` auf `true` gesetzt ist.

> **2.9.2.0 (freigegeben am 06.05.2020)**
>
> **Neu**
> - Weitere Überladungen der Konstruktoren der Klasse `OpcArgument`, die einen Wert der Enumeration `OpcDataType`, die NodeId eines Datentyps und benutzerdefinierte Array-Dimensionen akzeptieren.
> - Unterstützung n-dimensionaler (also mehrdimensionaler) Arrays strukturierter Datentypen.
> - Unterstützung n-dimensionaler Variablen-Nodes (einschließlich der neuen Eigenschaft `ArrayDimensions` in der Klasse `OpcVariableNode`).
> - Unterstützung von Null-Referenzen als Feldwert für Felder, die einen Referenz-Datentyp als Feldwert verwenden.
> - Unterstützung der NodeClass `ObjectType` im Dienst AddNodes.
> - Unterstützung der NodeClass `VariableType` im Dienst AddNodes.
>
> **Behoben**
> - Problem bei der automatischen Definition des `ValueRank` bei n-dimensionalen benutzerdefinierten strukturierten Datentypen.
> - Problem im Stack bei der Unterstützung n-dimensionaler benutzerdefinierter strukturierter Datentypen.
> - Probleme beim Laden von `UANodeSets` mit erweiterten Werten für die Attribute AccessLevel und UserAccessLevel in UAVariable-Einträgen (bezieht sich auf den Stack 1.04).
> - Problem mit `NullReferenceExceptions` beim Abruf von `OpcDataTypeInfo.BaseType` bei in NodeSets definierten Datentypen, die `UATypeDefinitions` ohne Felder verwenden.
> - Problem mit `NullReferenceExceptions` bei der Definition Encoding-unabhängiger Datentypen (also Enumerationen) als Teil des Adressraums. Dieses Problem betrifft nur die Server-API.
> - Problem mit falsch bestimmtem ValueRank bei `System.Byte`[], das im Stack der Foundation als ByteString interpretiert wurde.

> **2.9.1.0 (freigegeben am 22.04.2020)**
>
> **Behoben**
> - Problem, das zu doppelt durchsuchten Referenzen zwischen übergeordneten und untergeordneten Nodes führte, die mit einem NodeSet importiert wurden.
> - Probleme mit neueren Versionen von `System.ServiceModel.Primitives`. Rollback der Abhängigkeit auf Version 4.5.3 in allen Zielframeworks.
> - Probleme mit nachfolgenden Lizenzen für die Evaluation, die für die Bundle-Lizenzierung verwendet werden (Client und Server).
> - Problem mit falsch bestimmtem ValueRank bei `System.Byte`[], das im Stack der Foundation als ByteString interpretiert wurde.
> - Problem mit dem Ergebnis von `OpcNamespace.Get(int, Uri)`, das zu einem `OpcNamespace.Value` führt, der den durch den Parameter `namespaceUri` definierten `Uri.OriginalString` nicht wiedergibt.
> - Problem mit kaskadierten benutzerdefinierten Datentypen, wenn sie im `DataTypeEncoding` keine benutzerdefinierte NamespaceUri festlegen. Dieses Problem betrifft nur die Server-API.
> - Problem mit nicht angewendetem BrowseName in `AddNodes` bei Nodes der `NodeClasses`, die Node-Typen definieren. Dieses Problem betrifft nur die Server-API.
> - Probleme mit Nodes der `NodeClasses`, die Node-Typen definieren und beim `AddNode` falsch geprüft wurden. Dieses Problem betrifft nur die Server-API.

> **2.9.0.0 (freigegeben am 01.04.2020)**
>
> **Neu**
> - Vereinheitlichte Produktlizenzierung, die sich nicht mehr nach dem verwendeten Zielframework unterscheidet.
> - Alle Licenser-Klassen stellen ab sofort verschiedene Methoden bereit, deren Namen mit `FailIf` beziehungsweise `ThrowIf` beginnen, um bei Bedarf im benutzerdefinierten Code die verwendete Lizenz zu prüfen. Verwenden Sie die Methoden `FailIf` in Ihrer DEBUG-Konfiguration und die Methoden `ThrowIf` in Ihrer RELEASE-Konfiguration, um sich vor der nicht lizenzierten Verwendung des SDK zu schützen.
> - Neue Methoden `GetNodeType(...)` in `OpcClient` (nur für Ereignis-Node-Typen).
> - Neue Methoden `GetNodeTypeSystem(...)` in `OpcClient` (nur für Ereignis-Node-Typen).
> - Neue Methoden `GetNodeType(...)` in `OpcNodeSet`.
> - Neue Methode `GetNodeTypeSystem(...)` in `OpcNodeSet`.
> - `OpcMethodNode` unterstützt benutzerdefinierte Eingangs- und Ausgangsparameter, wenn die Schnittstelle `IOpcMethodCommand` verwendet wird.
> - Neue Methoden `GetNodeType(...)` und neue Methode `GetNodeTypeSystem()` in `OpcNodeSet`.
> - `OpcNode` vererbt ab sofort seinen `OpcNode.Namespace` an seine Kind-Nodes (falls diese bezüglich ihrer `OpcNode.Id` den Standard-Namespace verwenden).
> - Neue Spezialisierungen von `OpcTypeNodeInfo`: `OpcObjectTypeNodeInfo` und `OpcVariableTypeNodeInfo`.
> - Verbessertes Debugging und Inspizieren der Eigenschaften von Instanzen von `OpcNodeInfo` (und deren Unterklassen).
> - Browse unterstützt ab sofort das zusätzliche Lesen weiterer Attribute neben den Attributen, die bereits durch den Browse-Dienst unterstützt werden.
> - `OpcNodeInfo` implementiert jetzt `IOpcNodeInfo`, um eine flüssigere Verwendung von Node-Instanzen unabhängig von ihrem Ursprung zu ermöglichen.
> - Weitere konfigurierbare Dienste in `OpcClientServices`: Browse und `ReadNodes`.
> - Erheblich verbesserte Leistung beim Erstellen von Ereignisfiltern.
> - `IOpcNodeInfo` definiert jetzt weitere Methoden: `AttributeValue(...)`, `Child(...)` und `Children()`.
> - Unbeschränkte Browse-, Read- und Write-Operationen aufgrund automatischer Partitionierung von Anfragen (`OpcClient`).
> - Ereignis `OpcClient.CertificateJudgement` zur Behandlung von Problemen im Zusammenhang mit Zertifikaten, nachdem eine Verbindung hergestellt und Zertifikatsinformationen bereits erfolgreich validiert wurden.
> - `OpcModel` zur Darstellung von Modellinformationen in NodeSets.
> - Eigenschaft `OpcMemberSwitch.Conditions` zur Information über die Bedingungen, unter denen ein Switch ausgewertet wird.
> - Direkte Unterstützung von .NET Core 3.1 als eines unserer Zielframeworks.
> - Methode `ReplaceNode` in `OpcNodeManager`, um existierende Nodes rekursiv, auch bezüglich ihrer Notifier und MonitoredItems, zu ersetzen.
> - `OpcNodeSet` wurden zusätzliche Metadateneigenschaften (`LastModified` und `Name`) hinzugefügt.
> - Eine allgemeine Implementierung der Schnittstelle `IOpcMethodCommand` mit Delegaten: `OpcMethodDelegateCommand`.
> - Fehlende Dokumentation für Collections und einige andere Typen hinzugefügt.
> - `OpcNodeSetManager.ImplementNodeCallback` zum Implementieren von Nodes mithilfe eines einfachen Callbacks.
> - `OpcData.GetNodeId` unterstützt jetzt auch Array-Typen.
> - Kodierungsinformationen im Adressraum des Servers (intern) hinzugefügt.
> - Generische Implementierung von `IOpcMethodCommand` für Delegaten: `OpcMethodDelegateCommand`.
> - Unterstützung von `System.Object` und `System.Object`[] zum Kodieren und Dekodieren von Datentypen.
> - Unterstützung von Serialisierungs- und Deserialisierungsattributen, die in `System.Runtime.Serialization` für Datentypen definiert sind.
> - `OpcDataTypeMembersAttribute` zum Filtern von Elementen, die für Datentypen kodiert oder dekodiert werden sollen.
> - `OpcDictionary<TKey, TValue>` als einfacher, nicht standardmäßig verfügbarer Datentyp zum Transportieren von Wörterbüchern mit OPC UA.
> - Es ist nicht mehr notwendig, dem Namen oder der NodeId eines benutzerdefinierten Wurzel-Nodes, der in `OpcNodeManager.CreateNodes(...)` zurückgegeben wird, manuell den Standard-Namespace des benutzerdefinierten `NodeManager` zuzuweisen.
> - Berücksichtigung der Reihenfolge der Felder, wie sie innerhalb ihrer Vererbungshierarchie deklariert sind, sodass immer zuerst die Felder des Basisdatentyps definiert werden.
> - Neue Methoden `GetDataType(...)` in der Klasse `OpcClient`.
> - Neue Methoden `GetDataType(...)` in der Klasse `OpcNodeSet`.
> - `IOpcNodeInfo` definiert jetzt die Methoden `Child(...)` und `Children()`, um die Kind-Nodes von Instanz-Nodes abzurufen.
> - Neue Klasse `OpcNamespaceCollection`.
> - Eigenschaft `OpcNodeSet.Namespaces`, um die Namespaces bereitzustellen, auf die im NodeSet verwiesen wird.
> - `IOpcMethodCommand` zur Definition und Verwendung benutzerdefinierter Command-Instanzen statt der Definition eines expliziten Delegaten.
> - Klasse `OpcMethodCommands`, die vordefinierte Commands wie den NotImplemented-Command bereitstellt.
> - Erweiterung von `OpcMethodNode` zur Unterstützung von Instanzen von `IOpcMethodCommand`.
> - Erweiterung der generischen Klasse `OpcDataTypeNode<T>` zur Unterstützung von Klassen- und Struktur-Typen, die auf vorhandene OPC-UA-Strukturen abgebildet werden.
> - Neue nicht generische Klasse `OpcDataTypeNode`.
> - Statische Eigenschaft `OpcContext.Empty` zur Definition einer leeren Kontext-Instanz.
> - `IOpcNamespaceResolver` wurde in der Klasse `OpcContext` implementiert und ermöglicht so das Auflösen von Namespaces von Instanzen von `OpcNodeId`.
> - Klasse `OpcTypeSystem`, die als Basis für die existierende Klasse `OpcDataTypeSystem` und die neue Klasse `OpcNodeTypeSystem` dient.
> - Eigenschaft `OpcDataTypeDictionary.Documentation`.
> - Klasse `OpcNodeSetManager`, die das einfache Importieren und Hosten von `OpcNodeSets` mit `OpcNodeSetManager.Create(...)` unterstützt.
> - Geschützte virtuelle Methoden `OpcNodeManager.ImportNodes()` und `OpcNodeManager.ImplementNode(IOpcNode)`.
> - Vereinheitlichung und Vereinfachung der Auflösung des Attributs DataType, insbesondere bei der Verwendung nicht eingebauter Datentypen bei der Definition von Variablen- und Eigenschafts-Nodes. Das betrifft die folgenden Node-Klassen: `OpcDataItemNode`, `OpcDataItemNode<T>`, `OpcAnalogItemNode`, `OpcAnalogItemNode<T>`, `OpcDataVariableNode`, `OpcDataVariableNode<T>`, `OpcConditionVariableNode`, `OpcConditionVariableNode<T>`, `OpcPropertyNode`, `OpcPropertyNode<T>` und `OpcVariableNode`.
>
> **Geändert**
> - Lizenzschlüssel, die vor Version 2.9 ausgestellt wurden, funktionieren nicht mehr. Unsere Kunden erhalten entsprechend neue Lizenzschlüssel, die dann auch in allen Zielframeworks funktionieren.
> - `OpcAttributeWriteAccess` verwendet jetzt `UInt32` als Basistyp.
> - Der Standardwert der Eigenschaft `OpcAutomatism.AlwaysParseStringIdentifiers` ist jetzt `false`. Dadurch wird der Wert beim Aufruf des Konstruktors `OpcNodeId(string)` nicht mehr automatisch geparst. Weitere Details beschreibt `OpcAutomatism.AlwaysParseStringIdentifiers`.
> - [Client SDK] Die Klasse `OpcBrowseNode` wurde vom Namespace `Opc.UaFx.Client` in den Namespace `Opc.UaFx` verschoben.
> - [Client SDK] Die Enumeration `OpcBrowseNodeDegree` wurde vom Namespace `Opc.UaFx.Client` in den Namespace `Opc.UaFx` verschoben.
> - [Client SDK] `IOpcBrowseService` und `OpcBrowseRequest` verwenden jetzt die Klassen `OpcViewDescription` und `OpcBrowseNode` statt der Klassen `ViewDescription` und `BrowseDescription` der Foundation.
> - `OpcReadOnlyNamespaceCollection` wurde vom Namespace `Opc.UaFx.Server` in den Namespace `Opc.UaFx` verschoben.
> - Der Standardwert des Attributs DataType von `OpcDataTypeDictionaryNode` wurde von Byte auf ByteString geändert, um der Definition der Spezifikation zu entsprechen.
> - Die Eigenschaft `Description` wurde in `Documentation` umbenannt, um die Konformität zur Spezifikation sicherzustellen. Betroffen sind `IOpcDataTypeInfo`, `OpcDataTypeInfo` und `OpcDataFieldInfo`.
> - `OpcEncoding.All(...)` erzeugt jetzt die `OpcEncoding.Id` anhand des Standard-BrowseNames für die verschiedenen Encoding-Typen.
> - `OpcNamespace.ToString()` liefert ab sofort eine Zeichenkette, die ausschließlich `OpcNamespace.Value` und `OpcNamespace.Index` (falls nicht null) enthält.
> - `OpcNodeSet.GetDataTypeSystem()` liefert jetzt eine Instanz von `OpcDataTypeSystem`, die den typischen BrowseName der jeweiligen Kodierungsart (die das System repräsentiert) verwendet.
> - `IOpcTypeProvider.GetType(OpcEncoding)` wurde entfernt, weil Codierungsinformationen nur auf Datentypen zutreffen.
> - `OpcTypeCategory.EventType` und `OpcTypeCategory.ReferenceType` wurden entfernt.
>
> **Behoben**
> - Probleme bei der Validierung veralteter Zertifikate oder von Zertifikaten, die gegen bestimmte Richtlinien für allgemein gültige Zertifikate verstoßen. Solche Zertifikate können jetzt im Ereignis `CertificateValidationFailed` verarbeitet werden.
> - Problem bei der automatischen Anwendungskonfiguration, wenn die Entry-Assembly entweder kein `AssemblyTitleAttribute` definiert oder `string.Empty` als Assembly-Titel verwendet.
> - Problem bei Wertänderungen von Variablen-Nodes beim Wechsel zwischen verschiedenen komplexen Datentypen (die über ein `ExtensionObject` bereitgestellt werden).
> - Falsch erzeugte `EncodingMask` bei Datentypen mit mehr als einem optionalen Feld.
> - Falsche Interpretation von `OpcArgument.IsArray` und `OpcArgumentInfo.IsArray`.
> - Ein initial festgelegter `OpcVariableNode.Timestamp` wird nicht mehr während der Erstellung des Adressraums verworfen.
> - Problem mit falsch ermittelten Standardwerten und -rängen sowie Standard-Datentyp-NodeIds durch `OpcDataTypes.GetValueRank(..)` und `OpcDataTypes.GetNodeId(...)`.
> - Probleme mit DataTypeDictionary-Nodes, die keine DataTypeDescription-Nodes definieren, bei der Erzeugung des `DataTypeSystem` beim Aufruf von `OpcClient.GetDataTypeSystem()`.
> - Probleme bei der Dekodierung strukturierter Daten, die den neuen Typ `Opc.UaFx.Bit` verwenden.
> - Probleme bei der Verwendung von `OpcNodeId.UriIdentifier(...)`, wenn der Wert von `OpcNodeId.Value` kein `System.String`-Wert ist.
> - `OpcNamespace` behält jetzt die ursprüngliche Zeichenkette bei, die beim Definieren einer Instanz von `OpcNamespace` verwendet wurde. Nachfolgende Änderungen (durch die Klasse `System.Uri`) werden jetzt vermieden, sodass die Eigenschaft `OpcNamespace.Value` immer denselben `System.String`-Wert liefert, der bei der Definition der Instanz verwendet wurde.
> - Probleme, die in manchen Situationen dazu führten, dass eine neu erstellte Instanz von `OpcNode` zu einem späteren Zeitpunkt nicht mehr umbenannt werden konnte, wenn bei ihrer Erstellung kein Name angegeben wurde.

### 2.8

> **2.8.3.1 (freigegeben am 24.01.2020)**
>
> **Behoben**
> - Problem mit nicht mehr funktionierenden Subscription-Handlern nach erfolgreichem erneutem Verbindungsaufbau.
> - Problem mit verworfener Socket-Instanz in verworfenen Instanzen von `TcpMessageSocket`.

> **2.8.3.0 (freigegeben am 16.01.2020)**
>
> **Neu**
> - Unterstützung von `OpcExceptions` in Delegaten, die für Methoden-Nodes verwendet werden. Das ermöglicht die Definition eines Bad-Ergebnisses, ohne dieses manuell über den Parameter `OpcMethodContext` setzen zu müssen.
> - Unterstützung weiterer Access Levels (`StatusWrite` und `TimestampWrite`).
> - Ergänzung der Dokumentation für `OpcAccessLevel`, `OpcVariableNode.AccessLevel` und `OpcVariableNode.UserAccessLevel`.
> - Unterstützung des Abbruchs einer Verbindung während eines ausstehenden Wiederverbindungsversuchs im `OpcClient`.
> - Änderungen, um die Verwendung mit UWP-Anwendungen in Bezug auf die .NET Native Tool Chain zu verbessern.
>
> **Geändert**
> - Überarbeitete Logik zur Änderung der Eigenschaft `OpcClient.State`, um den Verlust einer Verbindung zum Server besser feststellen zu können.
> - Die Eigenschaft `OpcClient.State` ändert sich jetzt (während einer laufenden Anfrage) nur noch dann automatisch auf den Wert `Disconnected`, wenn der `ReconnectTimeout` größer als 0 ist (die Wiederverbindungslogik implementieren Sie selbst).
>
> **Behoben**
> - Problem mit nicht übernommenen Statusinformationen (Code), die an einen der Konstruktoren der Klasse `OpcValue` übergeben wurden.
> - Problem mit `TypeDictionaries`, die keine NamespaceUri bereitstellen.

> **2.8.2.1 (freigegeben am 13.12.2019)**
>
> **Behoben**
> - Problem beim Veröffentlichen paralleler Subscriptions beim Aufrufen eines Methoden-Nodes im `OpcClient`.
> - Problem mit nicht aktualisiertem `OpcVariableNode.Value`, falls einem Variablen-Node kein benutzerdefinierter `WriteVariableValueCallback` zugeordnet ist.
> - Problem, durch das der Wert der Eigenschaft `OpcClientKeepAlive.Interval` nicht auf die aktuelle Sitzung angewendet wurde.

> **2.8.2.0 (freigegeben am 06.11.2019)**
>
> **Neu**
> - Einführung von `Opc.UaFx.Bit` als .NET-basierte Darstellung des von der Foundation definierten Werttyps Bit, für den bisher keine konkrete Implementierung existiert.
>
> **Geändert**
> - Explizit kodierte Informationen, bekannt als `EncodingMask` eines strukturierten Datentyps, werden jetzt über den neu eingeführten Typ `Opc.UaFx.Bit` statt über `System.Boolean` abgebildet.
>
> **Behoben**
> - Problem mit gemischt strukturierten Datentypen, die führende Boolean-Werte gefolgt von weiteren Nicht-Boolean-Werten verwenden und einen falsch kodierten Datenstrom ergaben.
> - Problem beim Verbindungsaufbau zu einem OPC Classic Server in OPC Watch, wenn kein benutzerdefiniertes Zertifikat verwendet wird.
> - Problem in `OpcServerInfo.FromProcess(...)`, wenn die `ProductVersion` der `FileVersionInfo` der Instanz von `ProcessModule` aus `Process.MainModule` eine Versionszeichenkette bereitstellt, die nicht ausschließlich aus Zahlen und Punkten besteht, zum Beispiel `1.2.3.4-preview`.

> **2.8.1.3 (freigegeben am 24.10.2019)**
>
> **Behoben**
> - Problem beim Austausch strukturierter Datentypen ohne Verwendung der anstehenden Unterstützung für Metadaten.

> **2.8.1.2 (freigegeben am 23.10.2019)**
>
> **Geändert**
> - Angaben zu `iconUrl` und `licenseUrl` in NuGet-Paketen aufgrund ihrer Abkündigung angepasst.
>
> **Behoben**
> - Die Unterstützung von OPC Classic funktionierte nicht mehr („An internal error occurred as a result of a programming or configuration error“), weil der OPC-Classic-Client seine eingebetteten Ressourcen nicht mehr fand.
> - Problem mit der falschen Interpretation von `Int32`-Werten als Rückgabetyp von Methoden-Nodes.

> **2.8.1.1 (freigegeben am 11.10.2019)**
>
> **Neu**
> - Unterstützung für Methodenparameter vom Typ `System.Object`, die als OPC-UA-Variantenwerte interpretiert werden.
>
> **Behoben**
> - Probleme mit nicht berücksichtigten Methodenparametern vom Typ `System.Object`.
> - Problem beim Lesen großer Datei-Nodes (die Dateien darstellen, deren Inhalt die `MaxByteStringLength` überschreitet).

> **2.8.1.0 (freigegeben am 25.09.2019)**
>
> **Neu**
> - Methoden `RegisterNodes` und `UnregisterNodes` in der Klasse `OpcClient` zur Registrierung von Nodes, für die ein OPC UA Server in der aktuellen Sitzung einen schnelleren Zugriff realisieren soll.
> - Unterstützung der OPC-Classic-API in .NET Standard, damit die API auch in .NET-Core-Anwendungen unter Windows zur Verfügung steht.
> - Neue Methoden `OpcDataObject.HasField(name)` und `OpcDataObject.TryGetField(name, out field)`.
> - Verbesserte Leistung durch den Ausschluss der von der Foundation definierten Data Type Dictionaries beim Abrufen des Datentypsystems eines Servers.
> - Neue Eigenschaft `OpcClient.UseDynamic` und geänderter Standardwert der Eigenschaft `OpcAutomatism.UseDynamic` (`false`), um die Leistung beim Verbindungsaufbau zu steigern, wenn keine Informationen über Datentypen benötigt werden.
> - Unterstützung von Servern, die beim Abrufen der Data Type Dictionaries kein bereichsbasiertes Lesen von Daten unterstützen.
>
> **Behoben**
> - Absturz durch eine nicht behandelte Ausnahme beim Aufruf von `Socket.Shutdown()`.
>
> **Geändert**
> - Die Eigenschaft `OpcAutomatism.UseDynamic` hat ab sofort den Standardwert `false`. Damit das `OpcDataObject` genutzt werden kann, muss diese Eigenschaft oder die Eigenschaft `OpcClient.UseDynamic` auf `true` gesetzt werden.

> **2.8.0.0 (freigegeben am 18.09.2019)**
>
> **Neu**
> - Eine Reihe neuer Klassen zur Unterstützung der Definition, Verwendung und Reflexion benutzerdefinierter Datentypen in Clientanwendungen.
> - Neue Klasse `OpcNodeSet`, um eine datei-, zeichenfolgen- oder streambasierte Quelle bereitzustellen, die Informationen zum Datentypsystem aus einem `UANodeSet` liefert.
> - Neue Eigenschaft `OpcClient.NodeSet`, um eine Instanz der Klasse `OpcNodeSet` festzulegen, aus der Informationen zum Datentypsystem abgefragt werden, statt das Datentypsystem des Servers abzufragen.
> - Methode `OpcClient.GetDataTypeSystem()` zum Ermitteln des Datentypsystems, das der Client zum Auflösen von Datentypinformationen verwendet.
> - Eigenschaft `OpcAutomatism.UseDynamicTypeRegistration` zur Steuerung der automatischen Typreflexion, mit der Client- und Serveranwendungen die verschiedenen deklarierten Daten- und Ereignistypen bestimmen.
> - Neue Eigenschaft `OpcAutomatism.UseDynamic` zur Steuerung der dynamischen Typauflösung bei Verwendung benutzerdefinierter, aber nicht explizit deklarierter Datentypen in Clientanwendungen.
> - Neue Klassen `OpcNodeValue<T>` und `OpcAttributeValue<T>` sowie `IOpcNodeAttribute` mit `IOpcNodeDescriptor` in Verbindung mit `OpcNodeValuePair`, um Node-gebundene Werte zu deklarieren.
> - Erweiterung der Klasse `OpcClient` um die neuen Methoden `ReadNodeValue` und `WriteNodeValue` zum Lesen und Schreiben Node-gebundener Werte.
> - Verbesserte Ausnahmebehandlung, um StackTrace-Informationen vom Benutzercode bis zur Foundation- und Kommunikationsebene beizubehalten.
> - Neue Eigenschaft `OpcClient.KeepAlive` samt zugehöriger Klasse `OpcClientKeepAlive`, um die Keep-alive-Aktionen in einer Clientanwendung zu steuern und zu überwachen.
> - Dynamische Typkonvertierung in `OpcValue.As<T>()`.
> - Neue Methode `AsValue<T>()` in der Klasse `OpcValue`, um eine generische Definition des Werts mithilfe der neuen Klasse `OpcValue<T>` bereitzustellen.
> - `OpcNamespace` stellt die Namespace-Zeichenfolge beziehungsweise URI jetzt über die neue Eigenschaft `OpcNamespace.Value` bereit.
> - Die Standardgrenzen für den Transport wurden erhöht: `DefaultMaxByteStringLength` von 64 KB auf 5 MB und `DefaultMaxMessageSize` von 1 MB auf 10 MB.
> - Die intern behandelten Ausnahmen bei Verwendung der Klasse `XmlSerializer` beim Start wurden behoben.
> - Verbesserte Ausnahmebehandlung und -verfolgung beim Kodieren und Dekodieren von Daten (siehe `OpcTypes.EncodingFailed` und `OpcTypes.DecodingFailed`).
> - Unterstützung für das Tracing aller Kodierungsoperationen mithilfe der neuen Klassen `OpcEncodingStackFrame` und `OpcEncodingStackTrace`.
> - Unterstützung des Tracings der Dekodierung und Kodierung mithilfe der neuen Klassen `OpcEncodingStackFrame` und `OpcEncodingStackTrace`.
> - `int ResolveIndex(string namespaceValue)` und `string ResolveValue(int namespaceIndex)` zu `IOpcNamespaceResolver` hinzugefügt.
> - `OpcClient` bietet jetzt Methoden, um Aufrufe von `CallMethod` mithilfe der neuen generischen Methoden `CallAction` und `CallFunc` zu vereinfachen.
> - Zusätzliche Überladungen für `OpcBrowseNode`, um `OpcNodeIds` zu unterstützen, die auf bestimmte Referenztypen verweisen.
> - `OpcNodeInfo` bietet jetzt zusätzliche Überladungen von `Children(...)` und `Parents(...)`, die einen Wert von `OpcReferenceType` akzeptieren.
> - `OpcResult` liefert jetzt mit `GetBaseResult()` das Root-Ergebnis.
> - `OpcEventNode.EventTypeId` kann jetzt mit dem hinzugefügten Setter beschrieben werden.
> - Neues `OpcEventTypeAttribute` zur clientseitigen Definition benutzerdefinierter Ereignistypen, die zur Verarbeitung von Ereignisbenachrichtigungsdaten in Clientanwendungen verwendet werden.
> - Falsch verwendeter Statuscode beim Dekodieren im Foundation Stack korrigiert (vorher: `BadEncodingError`, jetzt: `BadDecodingError`).
> - Fehlende Eigenschaft `SourceType` zu `Opc.Ua.Schema.Binary.FieldType` hinzugefügt.
> - Fehlende Eigenschaft `BaseType` zu `Opc.Ua.Schema.Binary.BaseType` hinzugefügt.
>
> **Behoben**
> - Falsch verwendete Variable beim Konfigurieren von `Opc.UaFx.Client.OpcSubscription.LifetimeCount`.
> - Probleme bei der Serialisierung von Objekten vom Typ `OpcException`.
>
> **Geändert**
> - `OpcDataTypeAttribute` ist jetzt auf Klassen und Strukturen anwendbar.
> - `OpcNodeManager.NamespaceIndexes` und `OpcNodeManager.NamespaceUris` wurden in der neuen Eigenschaft `OpcNodeManager.Namespaces` zusammengefasst.
> - `IOpcReadOnlyDataStore` wurde in `IOpcReadOnlyNodeDataStore` umbenannt.
> - Die Methoden `Uri Resolve(int namespaceIndex)` und `int Resolve(Uri namespaceUri)` von `IOpcNamespaceResolver` sind jetzt veraltet.

### 2.7

> **2.7.5.1 (freigegeben am 15.08.2019)**
>
> **Neu**
> - Verwendung der `OpcNominalNodeIdFactory` (über `OpcNodeId.Factory`) zur Auflösung von OPC-Classic-Tag-Namen mit dem serverspezifischen Tag-Separator des OPC Classic Servers.
>
> **Behoben**
> - Problem mit mehrfach eingetragenen Serialisierungsdaten von Ausnahmen, das zu `SerializationExceptions` statt der eigentlichen Ausnahmen führte.

> **2.7.5.0 (freigegeben am 13.08.2019)**
>
> **Neu**
> - Verbesserte Dokumentation der API: `IOpcNode`, `IOpcNodeInfo` und `OpcNode`.
> - Änderungen am Stack, um sicherzustellen, dass Locks des Node-Managers nicht freigegeben werden, solange ein MonitoredItem angelegt, geändert oder gelöscht wird.
> - `System.ServiceModel.Primitives` wurde auf Version 4.5.3 aktualisiert. In `System.Private.ServiceModel` 4.5.x wurde ein Fehler behoben, durch den die `System.Private.ServiceModel.dll` bei .NET-Core-Anwendungen beim Publish für Windows (`win-xxx`) nicht kopiert wurde.
>
> **Behoben**
> - Probleme beim Kompilieren mit der .NET Native Tool Chain.
> - Probleme mit mehrfach auftretenden Benachrichtigungen nach einer erneuten Verbindung zum Server.
> - Probleme mit inline geparsten `OpcNodeIds` beim Erstellen einer `OpcNodeId` mit einem String-Identifier.
> - Problem mit falsch verwendeter Basisadresse und Security Policies im `OpcDiscoveryServer`.
> - Probleme mit unnötigerweise neu erstellten Instanzen von `OpcMonitoredItem`, wodurch der Vergleich dieser Instanzen nicht mehr funktionierte.
>
> **Geändert**
> - `OpcMonitoredItem.AutoFlushCache` wurde durch die neue Eigenschaft `OpcMonitoredItem.QueueMode` ersetzt, um den verwendeten Mechanismus beim Überlauf der Benachrichtigungsqueue klarer auszudrücken.

> **2.7.4.0 (freigegeben am 07.06.2019)**
>
> **Neu**
> - Die Auflösung von Domänennamen bei der Validierung von Client- und Server-Zertifikaten verwendet jetzt alternative Mechanismen, falls im Betriebssystem kein DNS-Server konfiguriert ist.
> - Der im Fall von HTTPS (im Stack der Foundation) nicht mehr verwendete `OperationTimeout` wird wieder angewendet.
> - Neue Ereignisse in der Klasse `OpcNodeManager`: `MonitoredItemsCreated`, `MonitoredItemsModified` und `MonitoredItemsDeleted`.
>
> **Behoben**
> - `SocketExceptions` unter macOS bei der Validierung von Domänennamen in Zertifikaten, wenn im Betriebssystem kein (erreichbarer) DNS-Server eingerichtet ist.
>
> **Geändert**
> - Einzelne Eigenschaften in den Klassen `OpcMonitoredItem`, `OpcServiceCounter`, `OpcSessionDiagnostics` und `OpcServerDiagnostics` liefern jetzt `long`- statt `int`-basierte Werte, um weiterhin die CLS-Konformität zu wahren, obwohl der Stack der Foundation vorzeichenlose Datentypen verwendet.

> **2.7.3.1 (freigegeben am 23.05.2019)**
>
> **Neu**
> - [Client SDK] Unterstützung von .NET Framework 4.6.
>
> **Behoben**
> - Problem beim Verbinden mit Servern, die HTTPS als Protokoll verwenden, unter macOS und Linux. Das Problem äußerte sich in der `OpcException` „An unrecognized response was received from the server.“

> **2.7.3.0 (freigegeben am 17.05.2019)**
>
> **Neu**
> - Die lokale Instanziierung von `X509Certificate2` wurde durch das Ereignis `OpcCertificateManager.QueryInstance` zum Laden von Zertifikatinformationen ersetzt. Das ermöglicht die benutzerdefinierte Erzeugung von Instanzen von `X509Certificate2` unter Verwendung eines entsprechenden `EventHandler`.
> - Die neue Eigenschaft `OpcCertificateStores.PathProbings` ermöglicht die benutzerdefinierte Anpassung der Probing-Mechanismen, mit denen die standardmäßig verwendeten Speicherorte der Zertifikatspeicher ermittelt werden.
> - Verbesserungen bei verschiedenen (kleinen) Problemen in Subscriptions und MonitoredItems (insbesondere beim automatischen Neuverbinden des Clients).
> - Der Klasse `OpcSubscription` wurden weitere Überladungen von `AddMonitoredItem(...)` hinzugefügt.
>
> **Behoben**
> - Problem beim Verbinden mit Servern, die HTTPS als Protokoll verwenden. Das Problem äußerte sich in der `OpcException` „An unrecognized response was received from the server.“
>
> **Geändert**
> - Die Implementierung der Klassen `OpcMonitoredItem` und `OpcSubscription` wurde aktualisiert: Einige `int`-basierte Eigenschaften wurden auf `long` umgestellt, um die zugrunde liegenden `uint`-Eigenschaften des Foundation Stacks `CLSCompliant` anzubieten.

> **2.7.2.0 (freigegeben am 10.05.2019)**
>
> **Neu**
> - Unterstützung von `TypeDefinition`-Informationen beim Browsen von Instanz-Nodes durch die neue Klasse `OpcInstanceNodeInfo`.
> - Neue Eigenschaft `Socket` in der Klasse `OpcSession` zur Identifizierung der Socket-Identitätsinformationen, die für den lokalen und den entfernten Endpunkt verwendet werden.
> - Produktsymbol der NuGet-Pakete geändert.
> - [Client SDK] Aktive Unterstützung von IL2CPP in Unity-Projekten. Dadurch werden vereinzelte Überlaufausnahmen durch IL2CPP behoben.
>
> **Behoben**
> - Probleme beim gleichzeitigen Browsen von mehr als einem Referenztyp, die zu einer `ArgumentOutOfRangeException` führten.
> - Probleme, die manchmal zu veralteten Informationen zu Subscriptions und MonitoredItems führen konnten, wenn der Client eine verlorene Verbindung zum Server automatisch wiederhergestellt hat.
> - Problem mit manchmal fehlenden Client- und Subscription-basierten Benachrichtigungsereignissen, zum Beispiel blieb `NotificationReceived` am `OpcClient` aus.

> **2.7.1.1 (freigegeben am 29.04.2019)**
>
> **Neu**
> - Aktualisierte Paketinformationen (`ProjectUrl` und `LicenseUrl`).

> **2.7.1.0 (freigegeben am 25.03.2019)**
>
> **Neu**
> - Ablehnung angeforderter NodeIds, die einen unbekannten Namespace-Index verwenden (im Dienst `AddNodes`, `BadNodeIdInvalid`).
> - Verwendung des für die NodeId zuständigen Node-Managers beim Anlegen von Nodes durch den Client. So wird sichergestellt, dass ein Node nicht zu den Nodes des Node-Managers des Eltern-Nodes hinzugefügt wird, wenn er auf einen Namespace eines anderen Node-Managers verweist.
> - Zugriffs- und Schreib-Flags eines Nodes werden ab sofort rekursiv vergeben, wenn ein Node durch einen Client angelegt wird.
>
> **Behoben**
> - Problem mit der Ablehnung von NodeIds, die der Client vorgibt (Dienst `AddNodes`).
> - Probleme mit benutzerdefinierten Node-Attributen zum Festlegen von Zugriffs- und Schreib-Flags beim Anlegen von Nodes durch den Client.
> - Korrektur der unschön generierten Namespace-URI des Standard-Namespace (unnötige `/` wurden entfernt).
> - Problem mit falsch verpackten .NET-Array-Typen bei der Verwendung von Instanzen von `OpcValue`.
> - Problem mit falsch verpackten UA-FX-Array-Typen bei der Verwendung von Instanzen von `OpcValue`.
> - Problem mit fehlenden DataType-Informationen bei (nicht generischen) Instanzen von `OpcVariableNode`, wenn diese über den Konstruktor mit einem Initialwert initialisiert werden und anschließend ihre Eigenschaft `DataType` auf den entsprechenden Typ festgelegt wurde. Ergebnis: Die Eigenschaft `DataType` übernahm den neuen Wert nicht.

> **2.7.0.2 (freigegeben am 15.03.2019)**
>
> **Behoben**
> - Fehlerhafte Adressierung von nicht verwaltetem Speicher (bei Verwendung von OPC Classic), die insbesondere in Anwendungen fehlschlagen kann, die die Option `LARGEADDRESSAWARE` verwenden.

> **2.7.0.1 (freigegeben am 15.03.2019)**
>
> **Behoben**
> - Problem mit Gebietsschemata, die vom OPC Classic Server unterstützt werden, aber nicht vom Betriebssystem des OPC Clients.
> - Problem bei der Kommunikation mit einem OPC Classic Server, der auf einem 64-Bit-System ausgeführt wird.

> **2.7.0.0 (freigegeben am 14.03.2019)**
>
> **Neu**
> - Vollständige Überarbeitung der Unterstützung von `AddNode` im `OpcClient` einschließlich eines vollständig neuen Satzes von Command-Typen zu `OpcAddNode` wie `OpcAddFolderNode`, `OpcAddObjectNode`, `OpcAddDataVariableNode`, `OpcAddAnalogItemNode` und weiteren.
> - Erstmalige vollständige Unterstützung von `AddNode`-Dienstaufrufen im `OpcServer`, die das Erstellen von Nodes aller unterstützten Typdefinitionen im Adressraum des Servers ermöglicht.
> - Vollständige Überarbeitung der Unterstützung von `DeleteNode`, `AddReference` und `DeleteReference` im `OpcClient` einschließlich der Neuauflage der Commands `OpcDeleteNode`, `OpcAddReference` und `OpcDeleteReference`.
> - Überarbeitung der Unterstützung der Dienstaufrufe `DeleteNode`, `AddReference` und `DeleteReference` im `OpcServer` mit zusätzlichen Validierungen der Anfragen.
> - Neue Klasse `OpcAddNodeResult`, eine Spezialisierung der Klasse `OpcResult`, die das Ergebnis, dessen Commands und die NodeId nach der Ausführung eines `AddNode`-Dienstaufrufs bereitstellt.
> - Der `OpcNodeManager` stellt ab sofort virtuelle Methoden bereit, die beim Hinzufügen (über den Dienst `AddNode`) und Entfernen (über den Dienst `DeleteNode`) von Nodes zum beziehungsweise vom Adressraum des Managers ausgeführt werden.
> - Verbesserte Ausnahmedetails bei der Verwendung der Dienste `AddNodes`, `DeleteNodes`, `AddReferences` und `DeleteReferences`.
> - Der Konstruktor der Klasse `OpcServerIdentity` stellt ab sofort eine Überladung für ein string-basiertes Passwort bereit.
> - Ereignisse von `OpcServer`: `RequestProcessing`, `RequestValidating`, `RequestValidated` und `RequestProcessed` zur Vor- und Nachverarbeitung von Client-Anfragen und den darauf gesendeten Antworten.
> - Die `OpcException` stellt ab sofort Informationen über `Source`, `StackTrace`, `Data` und `HelpLink` bereit (falls verfügbar) und verwirft eine ursprünglich andere Ausnahme nicht mehr.
> - Methode `IOpcNode.Child(...)` zum Ermitteln einer Kind-Instanz von `IOpcNode` über den Namen (also den BrowseName) des Kind-Nodes.
> - Zusätzliche Methodenüberladung `OpcServerIdentity.ChangePassword(string)`.
> - Zusätzliche Methodenüberladung `OpcUserNameAcl.AddEntry(...)` zur Definition einer benutzerdefinierten `OpcServerIdentity`.
> - Ableiten der Klasse `OpcResult` für benutzerdefinierte Typen.
>
> **Geändert**
> - Die Eigenschaft `OpcServerIdentity.Password` wurde entfernt, weil es keinen Grund gibt, das intern gespeicherte Passwort nach außen weiterzugeben. Außerdem ist es keine gute Praxis, einen Verweis auf ein Array über eine Eigenschaft bereitzustellen.
> - Der Delegat `OpcTransformUserPasswordDelegate` wurde entfernt.
> - `OpcUserNameAcl.PasswordTransform` wird durch die virtuellen Methoden `Matches` und `TransformPassword` in der Klasse `OpcServerIdentity` ersetzt.
>
> **Behoben**
> - Problem beim Schreiben eingebauter strukturierter Werte wie `OpcEngineeringUnitInfo` oder `OpcValueRange` mit `OpcClient.WriteNode`.
> - Problem beim Trennen einer Verbindung beziehungsweise beim Anhalten eines Clients oder Servers, das bei einem noch ausstehenden Verbindungsversuch zum Absturz führen kann.
> - Problem mit `StackOverflowExceptions` bei der Änderung der Instanz der Eigenschaft `OpcServer.Configuration`.

### 2.6

> **2.6.0.0 (freigegeben am 20.02.2019)**
>
> **Neu**
> - Unterstützung von OPC Classic über die Klasse `OpcClient` durch Angabe der Adresse im Schema `opc.com://<host>(:<port>)/<progId>/<classId>` (nur mit .NET Framework).
> - `OpcClassicInterface`, `OpcClassicInterfaces`, `OpcClassicInterfaceCollection` und `OpcClassicInterfaceCategory` (nur mit .NET Framework).
> - `OpcClassicApplicationDescription`, `OpcClassicApplicationDescriptionCollection`, `OpcClassicEndpointDescription` und `OpcClassicEndpointDescriptionCollection` (nur mit .NET Framework).
> - OPC Classic Discovery mit der neuen Klasse `OpcClassicDiscoveryClient`. Dafür wird `OpcEnum.exe` verwendet, eine COM-Anwendung, die Teil der OPC-Classic-Laufzeitumgebung ist (nur mit .NET Framework).
> - Erweiterung der Klasse `OpcDataChangeFilter` zur Unterstützung eines Triggers, des `DeadbandType` und eines `DeadbandValue`. Über die Eigenschaft `Trigger` lassen sich auch Änderungen des `SourceTimestamp` überwachen.
> - Zusätzliche Überladungen der Methode `OpcClient.SubscribeDataChange` und zusätzliche Überladungen der Konstruktoren von `OpcDataSubscribeDataChange`, die einen Wert der Enumeration `OpcDataChangeTrigger` akzeptieren.
> - Ein vordefinierter `ApplicationName` wird ab sofort als `SubjectName` eines Zertifikats verwendet, wenn ein neues Zertifikat (automatisch) für eine Client- oder Serveranwendung erstellt wird.
> - `OpcApplicationInstance` stellt eine Standardimplementierung der Schnittstelle `IOpcApplicationInstance` bereit.
> - `OpcClient` und `OpcServerBase` verwenden ab sofort die neue Klasse `OpcApplicationInstance` als gemeinsame Basisklasse.
> - `OpcSecurity` als generische Basisklasse für Sicherheitseinstellungen von Client- und Serveranwendungen.
> - `OpcClient` leitet von `OpcApplicationInstance` ab.
> - `OpcServer` leitet über seine Basisklasse `OpcServerBase` von `OpcApplicationInstance` ab.
> - Zentralisierte Anwendungskonfiguration (innerhalb des SDK) von Client- und Serveranwendungsinstanzen durch Einsatz der `OpcApplicationInstance`.
> - `OpcTransport` als generische Klasse zur Konfiguration der Transporteinstellungen, die jetzt Teil der Schnittstelle `IOpcApplicationInstance` ist.
> - `OpcSecurity` als generische Klasse zur Konfiguration der Sicherheitseinstellungen, die jetzt Teil der Schnittstelle `IOpcApplicationInstance` ist.
> - Die Eigenschaften `Security` und `Transport` wurden der Schnittstelle `IOpcApplicationInstance` hinzugefügt.
> - Das Ereignis `CertificateValidationFailed` wurde der Schnittstelle `IOpcApplicationInstance` hinzugefügt.
> - `OpcSecurityPolicyCollection` implementiert ab sofort einen öffentlichen Konstruktor.
>
> **Geändert**
> - Die Klasse `OpcClientTransport` wurde entfernt (ersetzt durch die neue Klasse `OpcTransport`).
> - Die Klasse `OpcServerTransport` wurde entfernt (ersetzt durch die neue Klasse `OpcTransport`).
> - Die standardmäßig verwendeten Serverinformationen, die die `OpcServerBase` bereitstellt, bevorzugen einen vordefinierten `ApplicationName`.
> - `OpcSecurityPolicyCollection` stellt keinen Konstruktor mehr bereit, der eine Instanz von `OpcServerBase` erwartet. Die zugehörige Eigenschaft `Owner` wurde ebenfalls entfernt.

### 2.5

> **2.5.7.0 (freigegeben am 06.02.2019)**
>
> **Neu**
> - `OpcClient.WriteNode` akzeptiert jetzt das direkte Schreiben von `null` als Node-Wert, ohne diesen zuvor in eine Instanz von `OpcValue` zu verpacken.
> - Die Klasse `OpcServer` stellt neue Konstruktorüberladungen bereit, die die Standardadresse aus `opc.tcp`, `localhost` und `4840` (dem Standardport) verwenden.
> - Der gesamte Node-Baum kann jetzt inline über neue Konstruktoren von `OpcObjectNode` und `OpcFolderNode` erzeugt werden. Dabei lassen sich die direkten Kind-Nodes beim Erstellen ihrer Eltern-Nodes übergeben.
> - Ab sofort ist sichergestellt, dass Lese- und Schreiboperationen auf Attributen abgebrochen werden, wenn benutzerdefinierte Read- oder Write-Callbacks ein Bad-Ergebnis liefern. Bei Good-Ergebnissen wird die Lese- oder Schreiboperation wie bisher fortgesetzt.
> - APIs, deren Signatur ausschließlich `nodeId : string` zur Identifizierung eines Nodes verwendet, interpretieren den übergebenen String-Wert inline, um eine flüssigere Verwendung der API des SDK zu gewährleisten.
>
> **Geändert**
> - Anwendungszertifikate werden nicht mehr unter `.\CertificateStores\Trusted`, sondern (standardmäßig) unter `.\CertificateStores\App` gespeichert, um beim Start der Anwendung die Suche nach dem Anwendungszertifikat zu beschleunigen.
> - Bei der Ermittlung der `OpcServerInfo` einer Assembly wird nicht mehr die `LinkTime`, sondern die `LastWriteTime` der Assembly verwendet.
>
> **Behoben**
> - Problem mit nicht übernommenem Initialwert bei Verwendung des Konstruktors `OpcDataVariableNode(parent, name, value)`.
> - Prüfungen des Werts (die zum Beispiel zu `BadTypeMismatch` führen) werden jetzt beim Schreiben des Attributs Value durchgeführt.

> **2.5.6.0 (freigegeben am 19.10.2018 [Client SDK], 06.02.2019 [Client+Server SDK])**
>
> **Neu**
> - Erweiterte Linker-Unterstützung für Android-Projekte beim Linken mit der Option SDK+User.
> - Erweiterte Auswahl des Standardverzeichnisses für Zertifikate. Zuerst wird das lokale Verzeichnis auf Schreibrechte geprüft, dann `CommonApplicationData` und schließlich `ApplicationData`.
> - Zusätzliche Unterstützung von .NET Framework 4.7.1 als Zielframework, um nicht mehr von 12 weiteren System-Assemblies abhängig zu sein. Diese Abhängigkeiten entstehen durch einen Fehler in .NET Framework 4.7.1 bei der Referenzierung von .NET-Standard-Assemblies. Details beschreibt der Microsoft-Artikel [Targeting .NET Framework 4.7.1 copies extra files to your bin directory](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/514195-Targeting%20.NET%20Framework%204.7.1%20copies%20extra%20files%20to%20your%20bin%20directory.md).
>
> **Behoben**
> - Fehler beim Prüfen, ob ein Zertifikat bereits im Zertifikatspeicher enthalten ist. Der Speicher lieferte immer den Wert `true`.
> - Fehler beim Browsen bei Verwendung der Linker-Option SDK+User in Android-Projekten.

> **2.5.5.0 (freigegeben am 11.10.2018 [Client SDK], 06.02.2019 [Client+Server SDK])**
>
> **Neu**
> - API für die reine Cliententwicklung aus OPC UA Advanced extrahiert.
> - Ereignis `CertificateRequested` in den Klassen `OpcClient` und `OpcServerBase` zum Abrufen eines alternativen Zertifikats, wenn ein existierendes Anwendungsinstanz-Zertifikat nicht gefunden oder nicht verwendet werden kann. Über dieses Ereignis lässt sich zusätzlich abrufen, warum ein neues Zertifikat benötigt wird. Außerdem kann der Client darüber seinen Benutzer informieren oder befragen.
> - Wenn auf das Verzeichnis `.\CertificateStores\` (das Standardverzeichnis für Zertifikate) nicht schreibend zugegriffen werden kann, wird der Pfad `$(AppData)\OPC Foundation\CertificateStores\` statt des Standardverzeichnisses verwendet, um die Zertifikate zu verwalten.
> - Erhöhte Standardlaufzeit für Zertifikate: von 12 Monaten (1 Jahr) auf 600 Monate (50 Jahre).
> - Reduzierte geforderte Standard-Schlüssellänge von 2048 auf 1024, um weiterhin ältere Zertifikate zu unterstützen.
> - Reduzierte Assembly-Größe und weniger Abhängigkeiten durch Reorganisation der intern verwendeten Lizenzierungsmechanismen für .NET Standard.
> - Wenn das Binden des Sockets fehlschlägt, wird die Ausnahme nicht mehr behandelt und auch keine allgemeine Ausnahme erzeugt. Stattdessen wird sie an den Aufrufer weitergereicht.
> - Eigenschaft `Binding` in der Klasse `OpcServer`, die eine Instanz der neuen Klasse `OpcServerBinding` bereitstellt.
> - Mit `OpcServerBinding` (Eigenschaft `OpcServerBase.Binding`) lässt sich beim Binden der Adresse ein Geltungsbereich angeben. Standardmäßig wird (wie zuvor) an jede `IPv4`- und jede `IPv6`-Adresse mit der angegebenen Portnummer gebunden.
> - Die Low-Level-Lese- und -Schreiboperationen des Node-Managers stellen ab sofort `OpcNodeAccessTokens` mit Informationen zum Ergebnis der Operation bereit.
> - Dokumentation für `OpcSubscription`, `OpcMonitoredItem`, `OpcMonitoredItemEventArgs`, `OpcMonitoredItemEventHandler` und weitere API zum Thema Subscriptions.
>
> **Geändert**
> - Standardwert von `MinimumCertificateKeySize` von 2048 auf 1024 geändert, um kleinere Schlüssellängen älterer Zertifikate zu unterstützen.
> - Wenn das Anwendungszertifikat einer Client- oder Serverinstanz über die Eigenschaft `Certificate` geändert wird, ändert sich der Store-Path-Type des Zertifikatspeichers für Anwendungszertifikate auf `System`. Um den Store-Path-Type `Directory` zu verwenden, ändern Sie ihn manuell. Stellen Sie außerdem nach der Änderung der Eigenschaft `Certificate` sicher, dass das Zertifikat im Zertifikatspeicher für Anwendungszertifikate enthalten ist.
>
> **Behoben**
> - `OpcServer.Security.AutoAcceptUntrustedCertificates` wurde bei der Verwendung gesicherter Endpunkt-Policies nicht für die automatische Annahme eines nicht vertrauenswürdigen Zertifikats berücksichtigt.
> - Problem beim automatischen Ermitteln der Startzeit der Node-Historie, wenn diese anzahlbasiert gelesen wird.
> - Problem beim Vergleich bisher nicht vergleichbarer Instanzen von MonitoredItems und Sitzungen.
> - Problem beim Schreiben von Rohdaten, die in einem `OpcValue` verpackt transportiert wurden.
> - Problem bei der Interpretation von `AutoAcceptUntrustedCertificates` in Serveranwendungsinstanzen.
> - Fehler, der zum Verwerfen des Store-Paths des Zertifikatspeichers für Anwendungszertifikate führte, wenn manuell ein Anwendungszertifikat festgelegt wurde.
> - Verwendung des falschen Startwerts beim Lesen historischer Werte ohne explizite Angabe einer Startzeit.

> **2.5.4.0 (freigegeben am 27.08.2018)**
>
> **Neu**
> - Unterstützung der automatischen History-Erzeugung im `OpcNodeHistorian` durch von Clients geschriebene Werte (Eigenschaft `AutoUpdateHistory`).
> - `OpcNodeHistorian` unterscheidet Node-Änderungen und nimmt nur noch Änderungen des Attributs Value in die Historie auf.
> - Verbesserte Code-Dokumentation der serverseitigen API für Subscriptions und MonitoredItems.
> - Instanzen von `Server.OpcSubscription` und `Server.OpcMonitoredItem` sind ab sofort vergleichbar.
>
> **Behoben**
> - `OpcVariableNode.IsHistorizing` wird nicht mehr nach dem Aufruf von `OpcNodeManager.CreateNodes` zurückgesetzt.
> - Problem beim Schreiben von Variablen-Nodes mit undefiniertem Attribut DataType (funktionierte nicht und führte zu einem Fehler).
>
> **Geändert**
> - `OpcNode.BeforeApplyChanges` und `OpcNode.AfterApplyChanges` werden nur noch ausgelöst, wenn Änderungen bestehen (siehe `OpcNode.HasPendingChanges`).

> **2.5.3.0 (freigegeben am 21.08.2018)**
>
> **Neu**
> - Automatische Ausrichtung des Werts nach dem Lesen eines Node-Werts (serverseitig) anhand des vom Client geforderten Encodings beziehungsweise Wertebereichs.
> - Neue Klasse `OpcClientTransport`, Zugriff über `OpcClient.Transport`, zur Konfiguration von Timeouts und Grenzen.
> - Neue Klasse `OpcServerTransport`, Zugriff über `OpcServer.Transport`, zur Konfiguration von Timeouts und Grenzen.
>
> **Behoben**
> - Problem bei der Validierung von X509-Identity-Tokens aufgrund falscher Zertifikatsdaten.

> **2.5.2.5 (freigegeben am 07.08.2018)**
>
> **Neu**
> - NuGet-Abhängigkeiten, die dem Projekt unnötig aufgezwungen wurden, wurden entfernt (in .NET Standard).
> - Der Inhalt der Datei `*.deps.json` wurde vereinfacht (in .NET Standard).

> **2.5.2.4 (freigegeben am 31.07.2018)**
>
> **Behoben**
> - Problem beim Senden globaler Ereignisse über Instanzen von `OpcServer` und `OpcNodeManager`.
>
> **Neu**
> - Unterstützung von Null-Instanzen von `OpcName` in der `OpcNominalNodeIdFactory`.
> - `OpcContext` stellt ab sofort immer eine gültige Instanz von `OpcNodeIdFactory` bereit (mindestens die Instanz, die über die Eigenschaft `OpcNodeId.Factory` festgelegt wurde).

> **2.5.2.3 (freigegeben am 25.07.2018)**
>
> **Neu**
> - NuGet aktualisiert.

> **2.5.2.2 (freigegeben am 23.07.2018)**
>
> **Behoben**
> - `InvalidCastException`, wenn die Assembly über `Assembly.LoadFrom()` geladen wurde.

> **2.5.2.1 (freigegeben am 13.07.2018)**
>
> **Behoben**
> - `DllNotFoundException`, wenn versucht wurde, auf bestimmte Typen zuzugreifen, bevor ein `OpcClient` oder `OpcServer` erstellt wurde.

> **2.5.2.0 (freigegeben am 06.07.2018)**
>
> **Neu**
> - Die Lizenzierung für .NET Standard wurde freigeschaltet. Sie gilt über die netstandard2.0-Assembly auch für .NET-Core-Anwendungen.

> **2.5.1.1 (freigegeben am 03.07.2018)**
>
> **Neu**
> - Die Lizenz für die Evaluation wurde erneuert, um eine neue Lizenzperiode bereitzustellen.

> **2.5.1.0 (freigegeben am 15.06.2018)**
>
> **Neu**
> - Unterstützung von MIME-Typen in `OpcFileNode` und in `OpcFileInfo`.
> - Verbesserte Leistung beim Zugriff auf Verweise auf `OpcContext` in `OpcNodes` (intern).
> - Verbesserte Leistung und geringerer Speicherbedarf beim Zugriff auf Kind-Nodes eines `OpcNode` (intern).
> - Standardmäßig vorbereitete Konfigurations-Nodes für historische Daten werden jetzt bei Bedarf erzeugt.
> - Interne Querverweise wurden aufgelöst und schwerfällige Callbacks durch ein Provider-Pattern ersetzt.
> - Die Schnittstelle `IOpcNodeInfo` wurde eingeführt, um das Erzeugen temporärer Instanzen von `OpcNode` überflüssig zu machen und um Leistung und Speicherbedarf zu verbessern.
> - Verwendung der Schnittstelle `IOpcNodeInfo` statt des eigentlichen Nodes, wenn der Verweis auf einen Node für die weiteren Operationen und Auswertungen nicht notwendig ist.
> - Einführung eines Caches für benutzerdefinierte Datentypen, damit diese nicht wiederholt reflektiert werden müssen. Das steigert die Leistung.
> - Ausnahmen bei der Ausführung von `CreateNodes(...)` werden nicht mehr abgefangen, sondern an den Aufruf von `OpcServer.Start` weitergereicht.
>
> **Geändert**
> - `IsNodeAccessible(..., IOpcNode node)` wurde zu `IsNodeAccessible(..., IOpcNodeInfo node)` geändert.

> **2.5.0.3 (freigegeben am 24.05.2018)**
>
> **Behoben**
> - Problem mit fehlenden externen Verweisen, wenn mehrere Node-Manager denselben benutzerdefinierten Node als Wurzel für ihre Nodes verwenden.

> **2.5.0.2 (freigegeben am 23.05.2018)**
>
> **Behoben**
> - Problem mit fehlenden Nodes, wenn mehrere Node-Manager auf denselben System-Node verweisen.

> **2.5.0.1 (freigegeben am 16.05.2018)**
>
> **Behoben**
> - `NullReferenceException` in `OpcMethodNode`, wenn ein vordefinierter Node als Eltern-Node des Methoden-Nodes verwendet wurde.
> - Nodes vom Typ `OpcDataVariableNode` wurden im Adressraum des Servers nicht mehr angezeigt, wenn der Konstruktor `(parent : IOpcNode, name : OpcName)` verwendet wurde.
>
> **Geändert**
> - Beispielprojekte wurden auf die C#-Sprachversion 6.0 zurückgestuft, um sicherzustellen, dass die Beispiele auch in älteren Versionen von Visual Studio kompilierbar sind.

> **2.5.0.0 (freigegeben am 10.05.2018)**
>
> **Neu**
> - Unterstützung zur Erstellung von Nodes mit benutzerdefinierten NodeIds.
> - Vereinheitlichung der Konstruktorüberladungen aller Node-Klassen.
> - Viele der bisher fehlenden Code-Dokumentationen der Node-Klassen wurden ergänzt.
> - Für jede Eigenschaft eines Nodes wurde die entsprechende Eigenschaft `XyNode` implementiert, die die Referenz auf den Eigenschafts-Node bereitstellt, der den Wert der bisher verfügbaren Eigenschaften `Xy` repräsentiert.
> - Unterstützung der späten Initialisierung von Nodes, mit der sich Werte der Eigenschaften `Xy` festlegen lassen, die beim Erzeugen der Eigenschafts-Nodes beim Start des Servers automatisch auf diese angewendet werden.
> - Komplette Überarbeitung der Klassen `OpcNodeId` und `OpcNamespace`. Beide Klassen wurden teilweise neu implementiert, um die maximale Kompatibilität zu den von der Foundation definierten Standards für NodeIds sicherzustellen, einschließlich der Features, die das SDK bietet.
> - `OpcNodeId` unterstützt Identifier als Byte-Arrays, GUIDs und vorzeichenlose Integer-Werte.
> - `OpcNodeId` drückt die Art des Identifiers in der String-Darstellung seines Identifier-Werts über `OpcNodeId.ToString` aus.
> - `OpcNodeId` unterstützt UTF-8-codierte Sonderzeichen in URL-formatierten NodeIds.
> - `OpcNodeId` unterstützt das Parsen von NodeIds im Format der Foundation.
> - `OpcNodeId` bietet weitere Eigenschaften, wie `OriginalString` und `OriginalFormat`.
> - Überarbeitete Implementierung von `OpcName`, die nicht mehr eine Kombination aus BrowseName, DisplayName und `SymbolicName` in einer Instanz beziehungsweise Klasse vereint.
> - `IOpcNode`, `OpcNode` und `OpcNodeInfo` stellen jetzt direkte Eigenschaften für den DisplayName (und `SymbolicName`) eines Nodes bereit.
> - `OpcNodeInfo` unterstützt das Browsen der Kinder und Eltern über eine Kombination von Werten der Enumeration `OpcNodeCategory`.
> - Die Methoden `OpcClient.SubscribeEventRaise` und `OpcSubscribeEventRaise` unterstützen jetzt eine Instanz von `OpcEventFilter` für die Ereignisfilterung.
> - Die vorhandene API zu UA Alarm und Events wurde überarbeitet und für eine flüssige und intuitive Schnittstelle einschließlich teilweise später Initialisierung (zur Leistungssteigerung) angepasst.
> - `OpcEventRaiseEventArgs` wurde überarbeitet und stellt über die Eigenschaft `Event` Snapshot-Informationen mit den Rohdaten des Ereignisses eines `EventNode` bereit.
> - Die Eigenschaft `MonitoredItem` wurde zu `OpcDataChangeEventArgs` und `OpcEventRaiseEventArgs` hinzugefügt.
> - Die Ereignisse `DataChangedReceived` und `EventRaiseReceived` wurden zur `OpcSubscription` hinzugefügt.
> - Enumeration `OpcEventType` und Klasse `OpcEventTypes` für den vereinfachten Zugriff auf die verschiedenen Ereignistypen.
> - Unterstützung für unterschiedliche Zustandsautomaten- und Zustands-/Übergangsvariablen-Nodes.
> - Das Ereignis `DialogRequested` wurde der Klasse `OpcClient` hinzugefügt, um die Verarbeitung von Instanzen von `OpcDialogConditionNode` zu vereinfachen.
> - Unterstützung von Foundation-spezifischen Ereignistypen: `OpcConditionNode`, `OpcAcknowledgeableConditionNode`, `OpcDialogConditionNode`, `OpcAlarmConditionNode`, `OpcDiscreteAlarmNode`, `OpcLimitAlarmNode`, `OpcOffNormalAlarmNode`, `OpcSystemOffNormalAlarmNode`, `OpcTripAlarmNode`, `OpcExclusiveLimitAlarmNode`, `OpcNonExclusiveLimitAlarmNode`, `OpcExclusiveDeviationAlarmNode`, `OpcExclusiveLevelAlarmNode`, `OpcExclusiveRateOfChangeAlarmNode`, `OpcNonExclusiveDeviationAlarmNode`, `OpcNonExclusiveLevelAlarmNode` und `OpcNonExclusiveRateOfChangeAlarmNode`.
>
> **Behoben**
> - Die Methode `GetOutpuArguments` von `OpcMethodNodeInfo` wurde in `GetOutputArguments` umbenannt.
> - Problem mit `DBNull`-Werten, wenn bei Methoden-Nodes kein Argumentwert definiert wurde.
>
> **Geändert**
> - Falsch geschriebene Member wurden korrigiert.
> - Vereinheitlichte API durch weitere selbstbeschreibende Bestandteile in Klassen- und Delegatnamen. Die Bezeichnungen wurden von `Data` auf `DataSet`, von `DataItem` auf `DataSetItem` und von `EventRaise` auf `Event` geändert.
> - `OpcNodeId.ToString` formatiert die Informationen jetzt im Format `OpcNodeIdFormat.Foundation`.
> - Die Reihenfolge der Subscription-Ereignisse wurde von MonitoredItem → Client → Subscription zu MonitoredItem → Subscription → Client geändert, um eine logischere Abarbeitungsreihenfolge beim Event-Bubbling sicherzustellen.
> - `OpcMonitoredItem.ReceivedDataChange` wurde in `OpcMonitoredItem.DataChangeReceived` umbenannt.
> - `OpcMonitoredItem.ReceivedEventRaise` wurde in `OpcMonitoredItem.EventRaiseReceived` umbenannt.
>
> **Kompatibilitätsbrüche durch Umbenennungen**
> - `OpcSubscribeEventRaise` -&gt; `OpcSubscribeEvent`
> - `OpcDataChangeEventArgs` -&gt; `OpcDataChangeReceivedEventArgs`
> - `OpcDataChangeEventHandler` -&gt; `OpcDataChangeReceivedEventHandler`
> - `OpcEventRaiseEventArgs` -&gt; `OpcEventReceivedEventArgs`
> - `OpcEventRaiseEventHandler` -&gt; `OpcEventReceivedEventHandler`
> - `OpcNotificationEventArgs` -&gt; `OpcNotificationReceivedEventArgs`
> - `OpcNotificationEventHandler` -&gt; `OpcNotificationReceivedEventHandler`
> - `OpcDataChangeCallback` -&gt; `OpcDataChangeReceivedCallback`
> - `OpcEventRaiseCallback` -&gt; `OpcEventReceivedCallback`
> - `IOpcNotificationData` -&gt; `IOpcNotificationDataSet`
> - `OpcNotificationData` -&gt; `OpcNotificationDataSet`
> - `OpcNotificationDataCollection` -&gt; `OpcNotificationDataSetCollection`
> - `OpcNotificationDataReadOnlyCollection` -&gt; `OpcNotificationDataSetReadOnlyCollection`
> - `OpcNotificationDataItem` -&gt; `OpcNotificationDataSetItem`
> - `OpcNotificationDataItemCollection` -&gt; `OpcNotificationDataSetItemCollection`
> - `OpcNotificationDataItemReadOnlyCollection` -&gt; `OpcNotificationDataSetItemReadOnlyCollection`
> - `OpcDataChange` -&gt; `OpcDataChangeSet`
> - `OpcDataChangeItem` -&gt; `OpcDataChangeSetItem`
> - `OpcEventRaise` -&gt; `OpcEventDataSet`
> - `OpcEventRaiseItem` -&gt; `OpcEventDataSetItem`
> - `OpcMonitoredItem`
>   - `.EventRaiseReceived` -&gt; `EventReceived`
>   - `.LastEventRaise` -&gt; `LastEvent`
>   - `.OnEventRaiseReceived` -&gt; `OnEventReceived`
> - `OpcSubscription`
>   - `.EventRaiseReceived` -&gt; `EventReceived`
>   - `.ReceivedEventRaiseCallback` -&gt; `ReceivedEventCallback`
>   - `.OnEventRaiseReceived` -&gt; `OnEventReceived`
> - `OpcClient`
>   - `.EventRaiseReceived` -&gt; `EventReceived`
>   - `.OnEventRaiseReceived` -&gt; `OnEventReceived`
>   - `.SubscribeEventRaise` -&gt; `SubscribeEvent`

### 2.3

> **2.3.2.0 (freigegeben am 13.03.2018)**
>
> **Behoben**
> - Problem mit fehlerhaftem `DebuggerDisplayAttribute` in `OpcVariableNode` und `OpcNodeInfo`.
> - Problem beim Lesen und Schreiben des Attributs DataType von `OpcVariableNodes`.
>
> **Geändert**
> - `OpcVariableNode` wurde als abstrakte Basisklasse festgelegt.
> - Mehrfache Node-Referenzen der Foundation wurden entfernt, um den Speicherbedarf zu senken.
>
> **Neu**
> - Erweiterung der Implementierung von `OpcVariableNode` speziell für Enumerations-Datentypen.
> - Neue Nodes `OpcTypeNode` und `OpcDataTypeNode`. Der `OpcDataTypeNode` unterstützt die Definition benutzerdefinierter Enumerations-Datentypen.
> - Erweiterte Unterstützung beim Browsen für Enumerations-Datentypen. Die neue Methode `OpcTypeNodeInfo.GetEnumMembers()` liefert alle Informationen über den Aufzählungstyp (siehe auch die neue Eigenschaft `OpcTypeNodeInfo.IsEnum`).

> **2.3.1.1 (freigegeben am 26.02.2018)**
>
> **Behoben**
> - Problem beim Laden einer `OpcApplicationConfiguration` aus einer Datei aufgrund des fehlenden Attributs DataContract an der Klasse `OpcApplicationConfiguration`, das bei älteren Versionen des SDK nicht benötigt wurde.
>
> **Neu**
> - Weitere Konstruktorüberladungen in `OpcEngineeringUnitInfo`, um die Initialisierung für bestimmte Einheiten zu vereinfachen.
> - Überladungen von `ToString` in `OpcEngineeringUnitInfo` und `OpcValueRange`.
> - Eigenschaft `CommonCode` in `OpcEngineeringUnitInfo` und statische Methode `GetCommonCode(int unitId)`.
> - Die `DefaultNamespaceUri` von `OpcEngineeringUnitInfo` wird verwendet, wenn der Konstruktor ohne expliziten Namespace-Parameter verwendet wird. Das gilt nicht für den Standardkonstruktor.

> **2.3.1.0 (freigegeben am 22.02.2018)**
>
> **Achtung**
> - Ab dieser Version muss dem Projekt ein Verweis auf das NuGet-Paket `Portable.BouncyCastle` (mindestens Version 1.8.1.3) oder auf die Assembly `BouncyCastle.Crypto` (mindestens Version 1.8.1.146) hinzugefügt werden.
> - Wenn eine Serveradresse mit dem Schema `https` verwendet wird, muss dem Projekt ein Verweis auf die NuGet-Pakete `Microsoft.AspNetCore.Server.Kestrel` (1.1.3) und `Microsoft.AspNetCore.Server.Kestrel.Https` (1.1.3) hinzugefügt werden.
>
> **Neu**
> - Einführung des Datentyps Range als `OpcValueRange`.
> - Einführung des Datentyps `EUInformation` als `OpcEngineeringUnitInfo`.
> - Einführung des neuen Node-Typs `AnalogItemType` als `OpcAnalogItemNode`.
> - Unterstützung für `DataValues`, die die Datentypen Range und `EUInformation` verwenden.
> - Erweiterte Browse-Unterstützung beim Browsen von Nodes der Definition AnalogItemType über die neue Klasse `OpcAnalogItemNodeInfo`.
> - Auf das Zielframework .NET Framework 4.6 aktualisiert.

> **2.3.0.0 (freigegeben am 13.02.2018)**
>
> **Neu**
> - Auf den OPC UA Foundation Stack 1.03.351.0 aktualisiert.
> - Neue Sicherheitsoption für Client und Server zur Konfiguration zusätzlicher Regeln für die Zertifikatvalidierung (siehe `OpcClient/OpcServer.Security.CertificateValidationRules`).
>
> **Geändert**
> - Das SDK unterstützt bei der Authentifizierung am OPC UA Server keine Windows-basierte Authentifizierung über die WinLogon-API mehr.
> - Anwendungszertifikate werden jetzt mit SHA256 erstellt (dem neuen Standardwert, den die Foundation vorschreibt). Das beeinflusst bestehende Anwendungen nicht. Die Änderung wirkt sich nur aus, wenn ein neues Zertifikat erstellt wird.

### 2.2

> **2.2.2.0 (freigegeben am 11.12.2017)**
>
> **Neu**
> - Die Erstellung von Filtern wurde über Operatorüberladungen vereinfacht, um eine natürlichere API zu erhalten.
> - `OpcText` wurde eingeführt, um lokalisierbare und für Menschen lesbare String-Werte darzustellen.
>
> **Behoben**
> - Der konfigurierte `OperationTimeout` wurde in `OpcClient.Connect()` nicht für die Discovery der Server-Endpunkte verwendet.
>
> **Geändert**
> - Die Implementierung von `OpcValue.ToString` wurde vereinfacht, sodass nur noch die Zeichenkette `null` für Null-Referenzen oder `Value.ToString()` geliefert wird.

> **2.2.1.0 (freigegeben am 06.09.2017)**
>
> **Neu**
> - Unterstützung unvollständiger Zertifikatsketten, wenn die Gegenstelle ein von einem unbekannten Aussteller signiertes Zertifikat vorlegt. Das ist zum Beispiel beim Versuch einer Verbindung zu einer Siemens SIMOTION der Fall.
> - Erweiterte Unterstützung fehlgeschlagener Zertifikatsprüfungen über das Ereignis `CertificateValidationFailed` in den Klassen `OpcClient` und `OpcServer`.

> **2.2.0.0 (freigegeben am 01.09.2017)**
>
> - **Neu:** Neue Methode `GetReferenceType`, um den zugehörigen `OpcReferenceType` für eine gegebene `OpcNodeId` des Typs Reference zu ermitteln.
> - **Geändert:** Die Spezialbehandlung des Attributs DataType in `OpcNodeInfo.Attribute()` wurde entfernt. Es wird also kein Wert vom Typ `OpcDataType` mehr bereitgestellt, sondern die datentypabhängige `OpcNodeId`.
> - **Neu:** Grundlegende Unterstützung von Objekt-Nodes, erweiterte Unterstützung von Variablen-Nodes sowie generische Unterstützung von Typ-Nodes (einschließlich `ObjectTypes`, `VariableTypes` und `DataTypes`) beim Browsen von Nodes.
> - **Neu:** Mit `OpcVariableNodeInfo`, `OpcObjectNodeInfo` und `OpcTypeNodeInfo` lässt sich der Adressraum jetzt mit Zusatzinformationen über die Nodes browsen. Das umfasst zum Beispiel auch die Typinformationen eines Variablen-Nodes mit allen typspezifischen Metadaten einschließlich Über- und Untertypen.
> - **Neu:** Das SDK wurde für die Verwendung unter .NET Standard und .NET Core 2.0 vorbereitet.
> - **Neu:** Neue Eigenschaft `LicenseInfo` in allen Licenser-Klassen, die Informationen über die verwendeten Lizenzbedingungen bereitstellt.

### 2.1

> **2.1.0.0 (freigegeben am 01.08.2017)**
>
> **Neu**
> - Auf den OPC UA Foundation Stack 1.3.342.0 aktualisiert.

### 2.0

> **2.0.1.1 (freigegeben am 07.06.2017)**
>
> **Neu**
> - Methoden `RegisterAddress` und `UnregisterAddress` sowie neue Methode `Addresses`, um die verschiedenen Basisadressen einer Instanz von `OpcServerBase` zu verwalten.
>
> **Behoben**
> - Falsche Bezeichnung `IsNodeAccessable` im `OpcNodeManager` in `IsNodeAccessible` korrigiert.
> - Problem mit fehlerhaften Node-Namespaces bei Verwendung einer Namespace-URI, die nur nach Schema aufgebaut wird, wenn `OpcNamespace.ToString()` aufgerufen wird (`FormatException`).
> - Problem mit der falschen impliziten Interpretation von Statuscodes als Ergebnisinformationen.

> **2.0.1.0 (freigegeben am 24.05.2017)**
>
> **Neu**
> - Mehr Details in der Meldung einer `OpcException` und in der Beschreibung einer Instanz von `OpcStatus` beziehungsweise `OpcResult`, um Quelle, Grund und Ergebnis einer Operation besser darzustellen.

> **2.0.0.0 (freigegeben am 21.05.2017)**
>
> - **Neu:** Assembly-Version auf 2.0.0.0 geändert.
> - **Neu:** Neue Klasse `OpcCertificateSettings`, um ein Anwendungsinstanz-Zertifikat zu konfigurieren, das der `OpcCertificateManager` erstellen kann.
> - **Behoben:** Problem mit falsch konfigurierten Anwendungszertifikaten bei Verwendung eines Speicherpfads, wenn das Zertifikat unter diesem Pfad nicht gefunden werden kann.
> - **Behoben:** Problem mit dem falsch gespeicherten Paar aus Benutzername und Passwort in der `UserName`-ACL (Access Control List), das zu einer fehlgeschlagenen Benutzerauthentifizierung führte.
> - **Behoben:** Problem beim Erstellen einer `OpcNodeId` aus dem Paar `string` und `int32`, bei dem der `int32`-Wert nicht als Namespace-Index der neuen NodeId verwendet wurde.
> - **Behoben:** Problem mit `OpcServerBase.Certificate` und `OpcClient.Certificate`, wenn das Zertifikat nicht im `ApplicationStore` des Zertifikatspeichers gespeichert ist.
> - **Neu:** Neue Klassen `OpcClientCertificateStores` (verfügbar über `OpcClient.CertificateStores`) und `OpcServerCertificateStores` (verfügbar über `OpcServerBase.CertificateStores`), um eine flüssige API für Client und Server zum Verwalten und Pflegen ihrer Zertifikatspeicher bereitzustellen.
> - **Neu:** Neue Klasse `OpcClientServices` (verfügbar über `OpcClient.Services`), um eine dienstbasierte API zum Aufbau der verschiedenen vom Client genutzten Dienste bereitzustellen.
> - **Entfernt:** `OpcValue.SourceLabel` und `OpcValue.ServerLabel`. Damit existiert auch die Klasse `OpcValueLabel` nicht mehr. Die von ihr bereitgestellten Eigenschaften stellt jetzt direkt die Klasse `OpcValue` bereit. Verwenden Sie die Eigenschaften `OpcValue.ServerXy` und `OpcValue.SourceXy`.
> - **Neu:** `IOpcWriteNodesService` unterstützt jetzt die automatische Ermittlung des Werts, den der Server für den `SourceTimestamp` eines `OpcValue` erwartet. Die automatische Ermittlung lässt sich deaktivieren, indem Sie über die Eigenschaft `IOpcWriteNodesService.TimestampSource` eine explizite `OpcTimestampSource` festlegen. Hinweis: Auf die Instanz von `IOpcWriteNodesService` greifen Sie über die Eigenschaft `OpcClient.Services.WriteNodes` zu.
> - **Neu:** Die veraltete Methode `ResolveNodeId` wird nicht mehr verwendet. Stattdessen gibt es die neue Methode `Resolve` an der `OpcNodeId`, die den voll qualifizierten Node bei Bedarf über das Namespace-Array des Servers bestimmt. Damit ist der Zugriff auf Nodes über die voll qualifizierte NodeId möglich, ohne den Index des zugehörigen Node-Namespaces zu kennen.
> - **Neu:** Zusätzliche Überladung der Methode `UpdateCertificate`, um manuell festzulegen, ob das Zertifikat erstellt werden soll, falls es fehlt oder ungültig ist. Bisher war das nur über die statische Eigenschaft `AutoCreateCertificate` möglich.
> - **Neu:** Neue Eigenschaften `OpcClient.Certificate` (um direkt ein benutzerdefiniertes Clientzertifikat festzulegen) und `OpcClient.Security` (um die Sicherheitsoptionen des Clients in einer Klasse einzurichten).
> - **Geändert:** Die Eigenschaft `OpcSecurity.Policies` wurde in `OpcSecurity.EndpointPolicies` umbenannt, um dem Modell von `OpcClientSecurity.EndpointPolicy` zu entsprechen.
> - **Geändert:** Der Standardwert von `OpcCertificateManager.AutoCreateCertificate` ist jetzt `true`.
> - **Neu:** Neue Eigenschaften in `Opc.UaFx.Server.OpcSecurity`: `AutoAcceptUntrustedCertificates` und `AutoCreateCertificate`.
> - **Neu:** Neue Eigenschaft `OpcServer.Certificate`, um demselben API-Modell zu entsprechen, das der `OpcClient` implementiert.
> - **Geändert:** Das Verhalten bei der Auswahl eines Endpunkts, mit dem eine Verbindung hergestellt werden soll, wurde geändert, sodass es nicht mehr verhandelbar ist, wenn eine explizite Endpunkt-Policy definiert ist.
> - **Geändert:** Der Standardwert von `AutoAcceptUntrustedCertificates` in der `SecurityConfiguration` ist jetzt `true`.
> - **Neu:** Unterstützung eines `DefaultNodeManager`. Das ist entweder der erste Manager in der Liste der definierten Manager oder der intern definierte Standard-Node-Manager, der den Namespace als `<serveraddress>/nodes/` definiert. Außerdem lässt sich jetzt auch nur eine Callback-Methode definieren, um die Nodes für den Adressraum des Standard-Node-Managers bereitzustellen.
> - **Verschoben:** Eigenschaft `OpcClient.PreferredPolicy` nach `OpcClient.Security.EndpointPolicy`.
> - **Verschoben:** Eigenschaft `OpcClient.UseDomainChecks` nach `OpcClient.Security.VerifyServersCertificateDomains`, Standardwert auf `false` geändert.
> - **Verschoben:** Eigenschaft `OpcClient.UserIdentity` nach `OpcClient.Security.UserIdentity`, Typ vom Foundation-Typ `IUserIdentity` in `OpcUserIdentity` geändert.
> - **Verschoben:** Eigenschaft `OpcClient.UseOnlySecureEndpoints` nach `OpcClient.Security.UseOnlySecureEndpoints`, Standardwert auf `false` geändert.
> - **Entfernt:** Veraltete Eigenschaft `OpcClient.UseAutoNodeIdResolution`.
> - **Neu:** Überarbeitung der Ableitungen von `OpcIdentity`: `OpcCertificateIdentity`, `OpcWindowsIdentity`, `OpcServerIdentity` und `OpcClientIdentity` sind jetzt Ableitungen von `OpcUserIdentity` (bisher verwendeten sie nur `OpcIdentity` als Basisklasse). Außerdem wurde ihr Konstruktionsverhalten geändert, um die Erstellung von Identitäten auf Client- und Serverseite zu vereinfachen.
> - **Behoben:** `OpcRequestType.Call` war bisher als `OpcRequestType.Cancel` definiert. Dadurch funktionierte `OpcRequestType.Call` nicht, weil es wie `OpcRequestType.Cancel` verwendet wurde.
> - **Entfernt:** Eigenschaft `OpcCertificateManager.AutoCreateCertificate`, weil sie jetzt je Instanz über `OpcClient.Security.AutoCreateCertificate` oder `OpcServer.Security.AutoCreateCertificate` verwendet wird. Diese Eigenschaften sind standardmäßig ebenfalls auf `true` gesetzt.
> - **Entfernt:** Eigenschaft `OpcServer.Security.Owner`, um überflüssige Informationen zu reduzieren und die API zu vereinfachen.
> - **Umbenannt:** `Server.OpcSecurity` in `Server.OpcServerSecurity`.
> - **Umbenannt:** `OpcServerSecurity.Anonymous` in `OpcServerSecurity.AnonymousAcl`.
> - **Umbenannt:** `OpcServerSecurity.Certificate` in `OpcServerSecurity.CertificateAcl`.
> - **Umbenannt:** `OpcServerSecurity.IssuedToken` in `OpcServerSecurity.IssuedTokenAcl`.
> - **Umbenannt:** `OpcServerSecurity.UserName` in `OpcServerSecurity.UserNameAcl`.
> - **Umbenannt:** `OpcClient.PreferredLocales` in `OpcClient.Locales`.
> - **Umbenannt:** `OpcClient.ReceivedNotification` in `OpcClient.NotificationReceived`.
> - **Umbenannt:** `OpcClient.OnReceivedNotification` in `OpcClient.OnNotificationReceived`.
> - **Umbenannt:** `OpcSubscription.ReceivedNotification` in `OpcSubscription.NotificationReceived`.
> - **Umbenannt:** `OpcSubscription.OnReceivedNotification` in `OpcSubscription.OnNotificationReceived`.
> - **Verschoben:** `OpcNodeCommand` von `Opc.UaFx.Client` nach `Opc.UaFx.Services`.
> - **Verschoben:** `OpcNodeAttributeCommand` von `Opc.UaFx.Client` nach `Opc.UaFx.Services`.
> - **Umbenannt:** `OpcNodeCommand` in `OpcNodeServiceCommand`.
> - **Umbenannt:** `OpcNodeAttributeCommand` in `OpcNodeAttributeServiceCommand`.
> - **Umbenannt:** Member von `OpcStatusCode` mit den Präfixen `Bad`, `Good` und `Uncertain`, wie die OPC Foundation sie verwendet, um Statuscodes in diese drei Kategorien zu unterteilen.
> - **Neu:** Zusätzliche Überladungen von `ReadNode`, um die numerische NodeId zusammen mit einem Namespace-Index und dem zu lesenden Attribut anzugeben.
> - **Neu:** Neue Methoden `ReadNodes`, um mehrere Nodes mit einem bestimmten Attribut zu lesen.

## 1.0–1.6 (2015–2017)

### 1.6

> **1.6.5.2 (freigegeben am 07.02.2017)**
>
> **Geändert**
> - Implizite Interpretationen einer numerischen NodeId, die als String codiert ist, wurden entfernt.

> **1.6.5.1 (freigegeben am 08.12.2016)**
>
> **Neu**
> - Erweiterte Behandlung von Timeouts für Read-History-Anfragen des `OpcClients`. Das ist notwendig, um dem Server mehr Zeit zum Sammeln der historischen Daten zu geben, falls das länger als gewöhnlich dauert und der Server aufeinanderfolgende Fortsetzungspunkte bereitstellt, bis die Datensammlung abgeschlossen ist.

> **1.6.5.0 (freigegeben am 07.12.2016)**
>
> **Neu**
> - Erweiterte Navigation in der Node-Historie bei einem festgelegten Zeitfenster (in dem `StartTime` und `EndTime` nicht gleich `MinDate` sind). Historische Node-Werte werden dabei für jede Seitenanfrage gesammelt, solange der Server einen Fortsetzungspunkt bereitstellt, bis entweder der Server keinen Fortsetzungspunkt mehr bereitstellt oder die Seite ihre Seitengröße erreicht hat.

> **1.6.4.0 (freigegeben am 12.10.2016)**
>
> **Neu**
> - Die Schnittstellendefinition von `IOpcNode` wurde an die aktuelle öffentliche API von `OpcNode` angepasst.
> - Neue Methode `Children()` : `IEnumerable<IOpcNode>` in `IOpcNode`, um physische Kinder im Node-Baum zu bestimmen.

> **1.6.3.0 (freigegeben am 06.10.2016)**
>
> - **Neu:** Neue Methode `OpcFileMethods.IsFileNode`, um zu bestimmen, ob auf einen Node wie auf einen FileType zugegriffen werden kann.
> - **Behoben:** Out-of-Memory-Problem bei der Verwendung von `OpcFile.ReadAllText` und `OpcFile.ReadAllLines`.
> - **Neu:** Verbesserte Leistung von `OpcFile.ReadAllText`: Der Text wird nicht mehr aus den Zeilen einer Datei zusammengesetzt, sondern aus dem binären Datenstrom der Datei gelesen.
> - **Neu:** Allgemein höhere Geschwindigkeit beim Lesen und Schreiben von Dateikomponenten durch Verwendung der vom Client konfigurierten `MaxByteStringLength`.
> - **Behoben:** Problem beim Browsen von Nodes, die Remote-Nodes enthalten, das zur Ausnahme „Cannot cast an absolute `ExpandedNodeId` to a NodeId. Use `ExpandedNodeId.ToNodeId` instead.“ führte.

> **1.6.2.0 (freigegeben am 04.10.2016)**
>
> - **Neu:** Neue Methode `CreateTempCertificate`, die auch verwendet wird, wenn `AutoCreateCertificate` auf `true` gesetzt und das Dienstprogramm zur Zertifikatgenerierung nicht installiert ist. Das Dienstprogramm muss daher zum Testen und Entwickeln nicht mehr zusammen mit OPC-Anwendungen bereitgestellt werden.
> - **Behoben:** Problem beim Öffnen von Dateien zum Schreiben: Die Zugriffsmaske wurde falsch geprüft.
> - **Neu:** Neuer Session Resource Manager, der alle sitzungsbezogenen Ressourcen freigibt, nachdem eine Sitzung abläuft oder geschlossen wird. Eine solche Ressource ist das interne Datei-Handle beim Zugriff auf Datei-Nodes über OPC. Wenn der Client die Verbindung zum Server aus irgendeinem Grund verwirft, gibt der Session Manager jetzt alle von der Sitzung belegten Ressourcen wieder frei.

> **1.6.1.0 (freigegeben am 14.09.2016)**
>
> **Neu**
> - Neue Methode `OpcNodeManager.Browse`, um benutzerdefiniertes Browsen in abgeleiteten Klassen zu unterstützen.

> **1.6.0.0 (freigegeben am 25.08.2016)**
>
> - **Neu:** Attribute ohne Wert werden beim Schreiben eines Node-Werts von der automatischen Aktualisierung der Quelle des Werts ausgenommen. Workarounds mit einem expliziten `OpcValue` sind damit überflüssig.
> - **Neu:** Neue Ableitung `OpcBrowseNodeContext` speziell für das Browsen von Nodes. Der bisherige `OpcNodeContext` wurde auf eine eher generische Implementierung für weitere Ableitungen reduziert. Der neue `OpcBrowseNodeContext` enthält jetzt die NodeId des Nodes, von dem die Browse-Operation ursprünglich ausging.
> - **Neu:** Neue Methode `OpcValue.As<T>`, um den repräsentierten Wert als bestimmten Typ abzufragen, indem der Wert in den durch `T` angegebenen Typ umgewandelt wird.
> - **Neu:** Neue Klasse `OpcResult`, die Instanzen von `ServiceResult` repräsentiert.
> - **Neu:** Neue Unterklasse `OpcMethodContext` von `OpcContext`, um Systeminformationen zu bestimmen, die für Methodenaufrufe relevant sind, einschließlich des aufgerufenen Methoden-Nodes und seines Ziels. Das umfasst auch das Speichern des Ergebnisses des Aufrufs der Callback-Methode.
> - **Neu:** Unterstützung des Dateisystemzugriffs auf Objekte vom Typ `OpcFileNode` aus Clientsicht. Das umfasst eine einfache 1:1-API-Schicht in der Klasse `OpcFileMethods` und ein `SafeOpcFileHandle`, das sicherstellt, dass zugeteilte Datei-Handles freigegeben werden. Dazu kommen die Klasse `OpcFile`, die OPC-basierte Dienstmethoden analog zur Klasse `System.IO.File` implementiert, die Klasse `OpcFileInfo`, die ein OPC-basiertes Objekt analog zur Klasse `System.IO.FileInfo` implementiert, und die Klasse `OpcFileStream`, die einen OPC-basierten Datenstrom analog zu `System.IO.FileStream` implementiert. `OpcFileStream` leitet von der Klasse `System.IO.Stream` ab und lässt sich daher mit allen Klassen `StreamReader` und `StreamWriter` verwenden, die das .NET Framework bereitstellt.
> - **Neu:** Neue Klassen `OpcPropertyNode` und `OpcPropertyNode<T>`.
> - **Geändert:** Der Typ `OpcVariableValue` benötigt jetzt einen generischen Typparameter für den repräsentierten Werttyp. Die Klasse `OpcVariableNode` wurde entsprechend angepasst.
> - **Neu:** Neue Klasse `OpcFileNode` einschließlich ihrer Kind-Nodes wie der Methoden-Nodes `Open`, `Close`, `GetPosition`, `SetPosition`, `Read` und `Write`.

### 1.5

> **1.5.11.7 (freigegeben am 28.07.2016)**
>
> **Behoben**
> - Problem mit Remote-NodeIds in `OpcNodeId`.
> - Problem beim Vergleichen von NodeIds verschiedener Typen in `OpcNodeId`.

> **1.5.11.6 (freigegeben am 17.06.2016)**
>
> **Neu**
> - Neue Methode `Child` in `OpcNodeInfo`, um die Nachfolger eines Nodes über seinen `OpcName` abzurufen. Das umfasst BrowseName, DisplayName und `SymbolicName` eines Nodes.
> - Neue Methode `Parent` in `OpcNodeInfo`, um die Vorfahren eines Nodes über seinen `OpcName` abzurufen. Das umfasst BrowseName, DisplayName und `SymbolicName` eines Nodes.
> - Neue Methode `Children` in `OpcNodeInfo`, um die Nachfolger eines Nodes einer bestimmten `OpcNodeCategory` abzurufen.
> - Neue Methode `Parents` in `OpcNodeInfo`, um die Vorfahren eines Nodes einer bestimmten `OpcNodeCategory` abzurufen.

> **1.5.11.5 (freigegeben am 13.06.2016)**
>
> **Neu**
> - Impliziter Cast-Operator für `ExpandedNodeIds`.
> - Zusätzliche Überladung der Methode `Get` in `OpcNamespace`, um Node-Namespaces über URI oder Index abzurufen.
>
> **Behoben**
> - Problem mit `ExpandedNodeIds` in `OpcValues`, deren Behandlung wurde vereinfacht.

> **1.5.11.4 (freigegeben am 30.05.2016)**
>
> **Neu**
> - Weniger Lock-Bedingungen beim Lesen und Schreiben von Nodes.

> **1.5.11.3 (freigegeben am 02.05.2016)**
>
> **Neu**
> - Die Lizenz für die Evaluation wurde erneuert, um eine neue Lizenzperiode bereitzustellen.

> **1.5.11.2 (freigegeben am 18.04.2016)**
>
> **Behoben**
> - Problem mit MonitoredItems beim Lesen des Initialwerts eines Nodes (der Server lief bei ungefilterten MonitoredItems in eine `NullReferenceException`).

> **1.5.11.1 (freigegeben am 31.03.2016)**
>
> **Neu**
> - Ereignis `Changed` in `OpcStatus` implementiert.
>
> **Behoben**
> - Problem mit nicht synchronisiertem OPC-Status zwischen SDK und Foundation Stack (in `OpcValue` und `OpcVariableNode`).

> **1.5.11.0 (freigegeben am 23.03.2016)**
>
> - **Neu:** `OpcNamespace`, der die gesamten Namespace-Informationen einer NodeId repräsentiert (Namespace-Index und Namespace-URI).
> - **Neu:** `IOpcNamespaceResolver`, implementiert von `OpcNodeManager`, `OpcClient` und `OpcServer`. Diese Schnittstelle stellt eine spät gebundene Namespace-Auflösung bereit, nachdem der `OpcServer` gestartet oder der `OpcClient` verbunden wurde. Jede `OpcNodeId`, deren Namespace aufgelöst wurde, stellt die voll qualifizierte URL des Namespace zusammen mit der NodeId bereit.
> - **Neu:** Eigenschaft `OpcNodeId.Namespace`, die den zugehörigen `OpcNamespace` bereitstellt.
> - **Geändert:** `OpcAttribute.Historizing` wurde in `OpcAttribute.IsHistorizing` umbenannt.
> - **Neu:** `OpcNode`: Überwachung von Node-Änderungen über die Eigenschaften `HasPendingChanges` und `PendingChanges` einschließlich der Methode `IsChangePending`.
> - **Neu:** Unterstützung der History für `OpcVariableNode` und seine Unterklassen.
> - **Neu:** Weitere Konstruktorüberladungen von `OpcStatusCollection`, um eine neue Instanz über `OpcStatusCodes` deutlich einfacher zu erstellen.
> - **Neu:** HDA-Methoden im Client zum Lesen und Aktualisieren der Node-Historie.
> - **Neu:** HDA-Schnittstelle im Server, um die benötigte Logik für den Zugriff auf historische Daten bereitzustellen.
> - **Neu:** HDA-Dienste: `IOpcReadNodesHistoryService` und `IOpcUpdateNodesHistoryService`.
> - **Neu:** HDA-Befehle: `OpcCreateNodeHistory`, `OpcDeleteNodeHistory`, `OpcDeleteNodeHistoryAtTime`, `OpcDeleteNodeHistoryModified`, `OpcReadNodeHistory`, `OpcReplaceNodeHistory` und `OpcUpdateNodeHistory`. Alle davon sind Unterklassen von `OpcNodeHistoryCommand`.

> **1.5.10.0 (freigegeben am 03.02.2016)**
>
> **Neu**
> - OPC Watch zum Assembly-Archiv hinzugefügt.

> **1.5.9.1 (freigegeben am 25.01.2016)**
>
> **Behoben**
> - Problem mit einer fälschlich geschlossenen und freigegebenen Sitzung, obwohl sie bei einer Neuverbindung wiederverwendet werden kann.

> **1.5.9.0 (freigegeben am 21.01.2016)**
>
> - **Behoben:** Mögliche Multithreading-Probleme im Keep-alive einer Sitzung im `OpcClient`.
> - **Geändert:** Das Ereignis `BreakDetected` wird jetzt nur ausgelöst, wenn der Timeout für die Neuverbindung gleich null ist.
> - **Behoben:** Wenn eine bereits verworfene Sitzung des OPC Clients geschlossen und freigegeben wurde, konnte das in manchen Fällen zu einer unerwünschten Neuverbindung zum Server führen, ausgelöst durch eine `ObjectDisposedException` der bereits verworfenen Client-Sitzung.

> **1.5.8.0 (freigegeben am 18.01.2016)**
>
> **Neu**
> - Lizenzierungslogik aktualisiert.

> **1.5.7.1 (freigegeben am 14.01.2016)**
>
> **Behoben**
> - Problem mit dem kleinstmöglichen `PublishingInterval` in der Klasse `OpcSubscription`.

> **1.5.7.0 (freigegeben am 09.01.2016)**
>
> - **Behoben:** Problem mit einer `NullReferenceException` in `OpcCertificateManager.CreateCertificate`, wenn als `applicationUri` eine Null-Referenz (Nothing in Visual Basic) übergeben wird.
> - **Behoben:** Problem mit nicht eindeutig generierten `OpcNodeIds` für `InputArguments` und `OutputArguments` der Instanzen von `OpcMethodNode`. Dadurch wurden beim Browsen oder Lesen der Eigenschaften der Methodenargumente nur die Argumente des zuletzt bereitgestellten `OpcMethodNode` veröffentlicht.
> - **Geändert:** Die `OpcNodeId` für die Nodes `InputArgument` und `OutputArgument` von Instanzen von `OpcMethodNode`. Weitere Informationen enthält der vorherige Eintrag.
> - **Geändert:** Die Klasse `OpcReadOnlyNodeCollection` stellt jetzt Instanzen von `IOpcNode` statt der internen Instanzen von `NodeState` der Foundation bereit.
> - **Neu:** Eine `OpcNodeId` kann jetzt aus Instanzen von `OpcName` erstellt werden, deren `SymbolicName` eine Null-Referenz (Nothing in Visual Basic) ist. In diesem Fall wird statt des `SymbolicName` der BrowseName verwendet.
> - **Neu:** Die `OpcReadNodesRequest` liefert jetzt standardmäßig beide Zeitstempel (Quelle und Server) zurück.
> - **Neu:** Neue Methoden in `OpcNodeManager`: `AddNode`, `RemoveNode` und `IsNodeAccessable`.
> - **Behoben:** Problem mit zeitweisen Duplikaten von ACEs (Access Control Entries), wenn ein ACE angefordert wird, der bereits zu einer ACL hinzugefügt wurde.

> **1.5.6.8 (freigegeben am 17.12.2015)**
>
> **Behoben**
> - Problem mit fehlender Aktualisierung des `TimeStamp` beim Schreiben von Node-Werten.
> - Problem mit fehlenden `TimeStamp`-Daten beim Lesen von Node-Werten.

> **1.5.6.7 (freigegeben am 17.12.2015)**
>
> **Neu**
> - Neue Methode `ChangePassword` in `OpcServerIdentity`, um das Benutzerpasswort nach dem Anlegen einer Identität zu ändern.
> - Neue geschützte Eigenschaft `SystemContext` im `OpcNodeManager`, um einen alternativen Kontext bereitzustellen, in dem systeminterne Änderungen vorgenommen werden können.
> - Die Klasse `OpcWriteNode` setzt jetzt beim Schreiben eines Nodes automatisch den Quellzeitstempel.
>
> **Geändert**
> - Das `OpcValueLabel` ist jetzt nicht mehr als Struktur, sondern als Klasse definiert.

> **1.5.6.6 (freigegeben am 16.12.2015)**
>
> **Neu**
> - Neue Methoden `AddNode` und `RemoveNode` im `OpcNodeManager`, um das dynamische Bereitstellen von Nodes nach dem Aufruf von `CreateNodes` zu unterstützen.

> **1.5.6.5 (freigegeben am 10.12.2015)**
>
> **Neu**
> - Zusätzliche Sitzungsinformationen in `OpcOperationContext` beim Aufruf von `IsNodeAccessable` im `OpcNodeManager`.

> **1.5.6.4 (freigegeben am 09.12.2015)**
>
> **Neu**
> - Neue Methode `IsNodeAccessable` im `OpcNodeManager`, um benutzerdefiniert festzulegen, ob innerhalb der View auf einen Node zugegriffen werden kann.

> **1.5.6.3 (freigegeben am 08.12.2015)**
>
> **Behoben**
> - Problem mit ACE-Duplikaten beim manuellen Hinzufügen zusätzlicher Einträge auf Anforderung.

> **1.5.6.2 (freigegeben am 12.10.2015)**
>
> **Behoben**
> - Problem beim Lesen und Schreiben von Instanzen und Arrays von `OpcValue` als Node-Werte auf Client- und Serverseite.
> - Problem bei der anonymen Benutzeranmeldung auf der Serverseite beim Erstellen eines Objekts vom Typ `OpcSession`.
>
> **Neu**
> - Umleitung für den Fall, dass der an den Konstruktor (string, int) der Klasse `OpcNodeId` übergebene String-Wert einen numerischen Identifier angibt. Die `OpcNodeId` wird dann mit dem numerischen Identifier statt mit dem String-Wert initialisiert.

> **1.5.6.1 (freigegeben am 08.09.2015)**
>
> **Behoben**
> - Problem, wenn die ACLs Anonymous und `UserName` gleichzeitig aktiviert sind.
>
> **Neu**
> - Zusätzliche Überladungen von `CreateCertificate` im `OpcCertificateManager`.

> **1.5.6.0 (freigegeben am 07.09.2015)**
>
> - **Geändert:** Die Eigenschaft `BuiltInType` wurde in `OpcAttributeInfo` in `DataType` umbenannt.
> - **Neu:** Das Browsen des Attributs DataType liefert jetzt einen Wert der Enumeration `OpcDataType`.
> - **Neu:** `OpcValue` als Ersatz für die Klasse `DataValue`.
> - **Neu:** Neue statische Methode `CreateCertificate` im `OpcCertificateManager`, um Zertifikate ohne weitere Konfiguration zu erstellen.
> - **Neu:** Die Klasse `OpcStatus` stellt jetzt die neue Enumeration `OpcStatusCode` als Code bereit.
> - **Neu:** Unterstützung der folgenden `OpcDataTypes`: `ExtensionObject`, `Value` und `Variant`.
> - **Geändert:** `DataValue` wurde in `OpcDataTypes` in `Value` umbenannt.
> - **Neu:** Unterstützung für den direkten Beginn des Browsens bei einem Methoden-Node.
> - **Geändert:** `OpcDiscoveryClient` wurde in den Namespace `Opc.UaFx.Client` verschoben.
> - **Behoben:** Problem mit der `NullReferenceException` beim Browsen nicht zwischengespeicherter Nodes.
> - **Neu:** Unterstützung einer Null-Referenz als Anwendungs-URI beim Erstellen von Zertifikaten.
> - **Neu:** Neue Abstraktionsschicht für verschiedene Typen von OPC Servern (`OpcServerBase`).
> - **Neu:** Neue Spezialisierung eines OPC Servers: OPC Discovery Server.
> - **Behoben:** Problem im OPC Client beim Zugriff auf die interne Sitzungsinstanz, obwohl diese verworfen wurde.

> **1.5.5.3 (freigegeben am 25.08.2015)**
>
> **Neu**
> - Vereinfachte Verwendung von `OpcVariableClass` in Lese- und Schreib-Callbacks, indem Status und Zeitstempel (falls kein anderer angegeben wurde) der Node-Instanz ermittelt werden.

> **1.5.5.2 (freigegeben am 24.08.2015)**
>
> **Behoben**
> - Problem, wenn die ACLs Anonymous und `UserName` gleichzeitig aktiviert sind.
>
> **Neu**
> - Das Member `Default` von `OpcAccessControlMode` wurde entfernt und seine Verwendung durch `Blacklist` ersetzt.

> **1.5.5.1 (freigegeben am 24.08.2015)**
>
> **Behoben**
> - Problem mit dem Null-DataType in `VariableNodes`.

> **1.5.5.0 (freigegeben am 24.08.2015)**
>
> **Neu**
> - Verschiedene Callback-Eigenschaften zum Lesen und Schreiben von Attributen von `OpcNode`.
> - Geschützte virtuelle Methoden zum Lesen und Schreiben von Attributen von `OpcNode`.
> - Spezifische Callback-Eigenschaften zum Lesen und Schreiben von Attributen von `OpcVariableNode`.
> - Geschützte virtuelle Methoden zum Lesen und Schreiben des Wertattributs von `OpcVariableNode`.
> - Die Klasse `OpcSession` stellt jetzt die Eigenschaften `UsedIdentity` und `SuppliedIdentity` bereit.
> - Neue Methode `Update` in `OpcStatus`.
> - Der `OpcContext` stellt jetzt eine Eigenschaft `Identity` bereit.
> - Neue Klasse `OpcMonitoredItem` im Server-Namespace.
> - `OnMonitoredItemCreated/Deleted/Modified` stellt jetzt eigene Klassen statt der Klassen der Foundation bereit.
>
> **Geändert**
> - Die Klassen `Identity` und `ImpersonationContext` wurden vom Namespace `Opc.UaFx.Server` in den Namespace `Opc.UaFx` verschoben.

> **1.5.2.0 (freigegeben am 18.06.2015)**
>
> **Neu**
> - Kein automatisches Aktualisieren des Endpunkts vor dem Verbinden, wenn im `OpcClient` ein bevorzugter Endpunkt definiert ist.
> - Neue Endpunkt-Identitätssicherheit in `OpcSecurity`, um verschiedene Endpunkte für einen oder mehrere ACEs zu aktivieren oder zu deaktivieren. Außerdem wurden einige existierende Methoden umbenannt.
> - Neues Ereignis `StateChanged` in `OpcClient`.

> **1.5.1.1 (freigegeben am 16.06.2015)**
>
> **Neu**
> - Neue Methode `InvokeService` in `OpcClient`, die Dienstroutinen in einem try-catch-finally-Block aufruft. So ist sichergestellt, dass die Statuseigenschaft des Clients auch bei einer Ausnahme den Verbindungsstatus wiedergibt, zum Beispiel einen Timeout oder eine verlorene Verbindung.
>
> **Behoben**
> - Problem mit Null-Referenzen als DisplayName und BrowseName in `OpcReferenceDescription`.

> **1.5.1.0 (freigegeben am 15.06.2015)**
>
> **Neu**
> - Neue Methode `SaveCertificate` im `OpcCertificateManager`.
> - Überarbeitung der kompletten Argumentbindung, um auch `out`- und `ref`-Parameter in `OpcMethodNode` zu unterstützen.
> - Unterstützung von `ByRef`-Typen in `OpcMethodNode`.
> - Neues lokales Server-Ereignis `CertificateValidationFailed`, um benutzerdefinierte Aktionen bei fehlgeschlagener Zertifikatvalidierung zu unterstützen.
> - Neue Klasse `OpcMethodNodeInfo`, abgeleitet von `OpcNodeInfo`, zum Browsen der Argumente von Methoden-Nodes.
> - Neue Klassen `OpcCertificateValidationFailedEventArgs` und `OpcCertificateValidationFailedEventHandler`.
> - Neue Eigenschaft `DataType` in `OpcDataVariableNode`.
> - Neue Eigenschaften `InputArguments` und `OutputArguments` in der Klasse `OpcMethodNode`. Außerdem erweiterte Unterstützung von Instanzen von `OpcArgument` mit dem `OpcArgumentAttribute` in benutzerdefinierten Delegaten.
> - Unterstützung von Null-Referenzen in allen impliziten Cast-Operatoren, die mit Referenztypen arbeiten.

> **1.5.0.0 (freigegeben am 10.06.2015)**
>
> - **Neu:** Logik, um beim Start eine für den Server vollständige Konfiguration zu generieren.
> - **Neu:** Komplette Überarbeitung der Endpunktauswahl über den `OpcDiscoveryClient` und die benutzerdefiniert bevorzugte `OpcSecurityPolicy`.
> - **Neu:** Verbesserte automatische Vervollständigung der Konfiguration abhängig vom Anwendungstyp.
> - **Neu:** Einführung der Transportprofilinformationen.
> - **Neu:** Die Konfiguration der `UserTokenPolicies` wurde beim Start in den `OpcServer` verschoben, und die Nachvollziehbarkeit der Eigenschaft `IsEnabled` wurde verbessert.
> - **Behoben:** Problem mit leeren Pfaden für Zertifikatspeicher.
> - **Neu:** Komplette Überarbeitung des Mechanismus für Node-Referenzen, um beim Erstellen der Node-Referenzen mehr Informationen bereitzustellen und OPC-Interna aus der Benutzer-API zu entfernen.
> - **Neu:** Komplette Überarbeitung der bisherigen Node-Implementierungen. Ihre Basisklassenreferenz wurde in eine interne Referenz verschoben, um die Verwendung des SDK zu verbessern und durch nützlichere APIs besser `CLSCompliant` zu entsprechen.
> - **Neu:** Unterstützung der Konfiguration von Basisadressen für Discovery Server.
> - **Neu:** Verbesserte Standardwerte der Konfiguration, auch beim Laden einer Konfiguration über eine der Methoden `Load`. Außerdem Standardunterstützung von `DiscoveryServerConfigurations`.
> - **Neu:** Weitere Vereinfachung der API.
> - **Neu:** Einführung von `OpcStatus` als Ersatz für `StatusCode`.
> - **Neu:** `OpcDiscoveryClient` verwendet statt Factory-Methoden jetzt Konstruktoren, um eine einheitliche Schnittstelle zwischen allen Server- und Client-Klassen bereitzustellen.

### 1.4

> **1.4.0.0 (freigegeben am 09.06.2015)**
>
> **Neu**
> - Zusammenlegung von `Opc.ClientFx.Advanced` und `Opc.ServerFx.Advanced` zu `Opc.UaFx.Advanced`.

### 1.0

> **1.0.0.0 (freigegeben am 11.01.2015)**
>
> **Neu**
> - Erstellung von `Opc.ClientFx.Advanced` und `Opc.ServerFx.Advanced`.
