# Anwendung ausliefern

> Anleitung: Eine Clientanwendung ausliefern: Dateien und Abhängigkeiten, Netzwerk, eigenes Anwendungszertifikat, XML-Konfiguration und Lizenzierung.

So bereiten Sie Ihre OPC-UA-Clientanwendung für den Produktivbetrieb vor.

## Dateien mitliefern

Das OPC UA .NET SDK besteht je Zielframework aus einer einzigen Assembly. Der OPC UA Stack und die weiteren Bibliotheken des SDK sind darin enthalten. Welche Zielframeworks es gibt, nennt die Seite [Voraussetzungen](https://www.traeger.de/docs/development/opcua/requirements#zielframeworks). Eine Installation oder Registrierung des SDK auf dem Zielrechner ist nicht nötig.

Je nach Zielframework hängt das Paket von weiteren NuGet-Paketen ab, zum Beispiel von `Newtonsoft.Json` und `BouncyCastle.Cryptography`. Ab Version 2.59 ersetzt `BouncyCastle.Cryptography` (Version 2.7.0) das Paket `Portable.BouncyCastle`. Wenn Ihre Anwendung die Assemblies selbst verteilt, liefern Sie deshalb `BouncyCastle.Cryptography.dll` statt `BouncyCastle.Crypto.dll` aus. Die vollständige Liste je Zielframework steht auf der Paketseite bei nuget.org ([Opc.UaFx.Client](https://www.nuget.org/packages/Opc.UaFx.Client/), [Opc.UaFx.Advanced](https://www.nuget.org/packages/Opc.UaFx.Advanced/)). Diese Pakete gehören zur Anwendung: `dotnet publish` und das Build-Verzeichnis enthalten sie automatisch. Liefern Sie deshalb das vollständige Ausgabeverzeichnis aus, nicht nur Ihre eigene Assembly und die des SDK.

Die Zertifikatspeicher legt das SDK standardmäßig als Verzeichnisse unter dem Pfad der Anwendung an (Ordner `CertificateStores`, siehe [Anwendungszertifikat](https://www.traeger.de/docs/development/opcua/client/configuration#anwendungszertifikat)).

Nur unter Windows verfügbar sind:

- **OPC Classic:** Der Zugriff auf OPC Classic Server über COM und DCOM setzt das Paket `Opc.UaFx.Advanced` und die auf dem Zielrechner installierte [OPC Classic Runtime](https://www.traeger.de/docs/development/opcua/downloads#opc-classic-runtime) voraus (siehe [OPC Classic](https://www.traeger.de/docs/development/opcua/client/opc-classic)).
- **Zertifikatspeicher von Windows:** Das SDK verwendet sie nur, wenn der Pfad eines Zertifikatspeichers mit `CurrentUser\` oder `LocalMachine\` beginnt.

## Netzwerk freigeben

Der Client baut die Verbindung zum Server selbst auf. Geben Sie deshalb in der Firewall des Zielrechners und im Netzwerk die ausgehende Verbindung zum Port des Serverendpunkts frei, also zum Port in der Adresse des Servers (zum Beispiel `4840` in `opc.tcp://localhost:4840`). Für entfernte OPC Classic Server gelten die Einstellungen für DCOM (siehe [Entfernte Server und DCOM-Sicherheit](https://www.traeger.de/docs/development/opcua/client/opc-classic#entfernte-server-und-dcom-sicherheit)).

## Eigenes Anwendungszertifikat verwenden

Verwenden Sie im Produktivbetrieb kein Zertifikat, das das SDK automatisch erzeugt.

**Wenn Sie bereits ein passendes Zertifikat haben**, laden Sie Ihr PFX-basiertes Zertifikat über den `OpcCertificateManager` aus einem beliebigen Speicherort und weisen es der Clientinstanz zu:

```csharp
var certificate = OpcCertificateManager.LoadCertificate("MyClientCertificate.pfx");
client.Certificate = certificate;

```

```vbnet
Dim certificate = OpcCertificateManager.LoadCertificate("MyClientCertificate.pfx")
client.Certificate = certificate

```

Der Name der Anwendung muss im Zertifikat als „Common Name“ (CN) enthalten sein. Er muss mit dem Wert des Attributs `AssemblyTitle` der Anwendung übereinstimmen:

```csharp
[assembly: AssemblyTitle("<Common Name (CN) in Certificate>")]

```

```vbnet
<Assembly: AssemblyTitle("<Common Name (CN) in Certificate>")>

```

Wenn das nicht der Fall ist, legen Sie den im Zertifikat verwendeten Namen über die Eigenschaft `ApplicationName` der Clientinstanz fest. Wenn Sie das Zertifikat wie oben direkt über die Eigenschaft `Certificate` zuweisen, entfällt die Suche anhand des Namens:

```csharp
client.ApplicationName = "<Common Name (CN) in Certificate>";
```

```vbnet
client.ApplicationName = "<Common Name (CN) in Certificate>"
```

Die Eigenschaft `ApplicationUri` müssen Sie dabei nicht festlegen. Der Client übernimmt den Wert beim Verbindungsaufbau aus dem Subject Alternative Name des Zertifikats.

**Wenn Sie noch kein passendes Zertifikat haben**, das Sie als Anwendungszertifikat für Ihren Client verwenden können, erzeugen Sie zumindest ein selbstsigniertes (engl. self-signed) Zertifikat. Liefern Sie es mit der Anwendung aus und laden Sie es wie oben gezeigt. Das Zertifikat erzeugen Sie über die Klasse `OpcCertificateManager`. Die Eigenschaften des Zertifikats legen Sie über eine Instanz der Klasse `OpcCertificateSettings` fest. Dazu gehören zum Beispiel der Name der Anwendung, die `ApplicationUri`, die Gültigkeit in Monaten oder die Namen der Domänen, in denen der Client eingesetzt wird:

```csharp
// The lifetime is specified in months, the default is 600.
var settings = new OpcCertificateSettings("MyClientAppName") {
    ApplicationUri = new Uri("urn:localhost:MyClientAppName"),
    Lifetime = 60
};
 
settings.DomainNames.Add("localhost");
 
var certificate = OpcCertificateManager.CreateCertificate(settings);
OpcCertificateManager.SaveCertificate("MyClientCertificate.pfx", certificate);
```

```vbnet
'The lifetime is specified in months, the default is 600.
Dim settings = New OpcCertificateSettings("MyClientAppName") With { _
    .ApplicationUri = New Uri("urn:localhost:MyClientAppName"), _
    .Lifetime = 60 _
}

settings.DomainNames.Add("localhost")

Dim certificate = OpcCertificateManager.CreateCertificate(settings)
OpcCertificateManager.SaveCertificate("MyClientCertificate.pfx", certificate)
```

Verwenden Sie als Namen der Anwendung den Wert des Attributs `AssemblyTitle`, oder legen Sie denselben Wert über die Eigenschaft `ApplicationName` der Clientinstanz fest. Wenn der Client das Zertifikat nicht direkt laden, sondern aus dem Speicher für Anwendungszertifikate verwenden soll, speichern Sie es im `ApplicationStore`. Das ist standardmäßig der Ordner `CertificateStores\App` neben der Anwendung, siehe [Anwendungszertifikat](https://www.traeger.de/docs/development/opcua/client/configuration#anwendungszertifikat).

## Dateien der XML-Konfiguration mitliefern

Wenn Sie die Anwendung über eine XML-Datei konfigurieren, liefern Sie diese Datei mit der Anwendung aus. Die Datei muss für die Anwendung erreichbar sein:

- Wenn die Anwendung die Konfiguration über `LoadClientConfigFile` lädt, muss die Datei unter dem dort angegebenen Pfad liegen.
- Wenn die Anwendung die Konfiguration über `LoadClientConfig` lädt, muss die Datei `<Name>.Config.xml` (zum Beispiel `Opc.UaFx.Client.Config.xml`) im Arbeitsverzeichnis der Anwendung liegen. Das Arbeitsverzeichnis ist nicht unbedingt das Verzeichnis der Anwendung, etwa wenn die Anwendung als Dienst läuft.

Der Client wertet die `App.config` der Anwendung für seine Konfiguration nicht aus (siehe [Konfiguration per XML-Datei](https://www.traeger.de/docs/development/opcua/client/configuration#konfiguration-per-xml-datei)).

## Unter UWP ausliefern

Unter UWP (Universal Windows Platform) gelten für Anwendungen strenge Vorgaben, ähnlich wie bei Mobilanwendungen. Damit die UWP-App über OPC UA als Clientanwendung arbeiten kann, stellen Sie im Projekt die folgenden Fähigkeiten (engl. Capabilities) ein:
- `internetClient`
- `privateNetworkClientServer`

Das zusätzlich benötigte Anwendungszertifikat kann das OPC UA .NET SDK unter UWP nicht automatisch erstellen. Erstellen Sie das Anwendungszertifikat deshalb manuell außerhalb der UWP-Anwendung. Sie können es dann als Teil der `Assets` der Anwendung ausliefern und von dort laden. Wie ein UWP-Projekt aufgebaut sein kann, zeigt das Beispiel [OPC UA .NET Samples: UWP Client](https://github.com/Traeger-GmbH/opcuanet-samples/tree/master/cs/Platforms/Client.Uwp).

## Lizenz eintragen

Tragen Sie den Lizenzschlüssel in der Anwendung ein, bevor Sie die Clientanwendung ausliefern. Sonst läuft sie je Anwendungsstart nur 30 Minuten. Wie Sie den Schlüssel eintragen, die verwendete Lizenz abfragen und die Lizenz beim Start prüfen, beschreibt die Seite [Lizenz einrichten](https://www.traeger.de/docs/development/opcua/license-setup).
