COM-DLL für den Zugriff auf die YouTube-API

In der Artikelreihe “YouTube-Kanal mit VB.NET verwalten” haben wir Methoden vorgestellt, mit denen wir die Videos eines YouTube-Kanals auslesen und mit denen wir neue Videos hochladen oder die Eigenschaften bestehender Videos anpassen können. Diese Methoden wollen wir nun in einer DLL zusammenfassen, die wir in eine Office-Anwendung wie Excel oder Access einbinden können, um von dort aus beispielsweise Titel und Beschreibungstexte lesen und schreiben zu können. Im vorliegenden Artikel zeigen wir daher, wie wir die bereits beschriebenen Funktionen in einem neuen Projekt verwenden und daraus die gewünschte DLL erstellen. In einem weiteren Artikel zeigen wir dann, wie Du von Excel aus die Daten der Videos eines Kanals in eine Excel-Tabelle einlesen kannst.

Projekt für die COM-DLL erstellen

Wenn wir eine COM-DLL erstellen wollen, auf die wir von Office-Anwendungen aus per VBA zugreifen können, wählen wir beim Erstellen eines neuen Projekts in Visual Studio den Typ Klassenbibliothek (.NET Framework) – Ein Projekt zum Erstellen einer Klassenbibliothek (.dll) und nicht Klassenbibliothek – Ein Projekt zum Erstellen einer Klassenbibliothek für .NET Standard oder .NET Core aus (siehe Bild 1). Mit letzterer können wir aktuell keine COM-DLLs erstellen.

Erstellen eines neuen Projekts

Bild 1: Erstellen eines neuen Projekts

Im nächsten Schritt wählen wir den Speicherort aus und geben als Projektnamen YouTubeAPIV3 an. Als Zielframework wählen wir .NET Core 3.1 aus. Das neue Projekt erwartet uns dann in Visual Studio mit einer leeren Klasse namens Class1.vb.

NuGet-Pakete hinzufügen

Für den Zugriff auf die YouTube-API v3 benötigen wir zwei NuGet-Pakete. Um diese hinzuzufügen, öffnen wir mit Projekt|NuGet-Pakete verwalten… den NuGet-Bereich. Im Bereich Durchsuchen suchen wir nach den beiden Paketen Google.Apis.YouTube.v3 und Google.Apis.Oauth2.v2 und installieren diese.

Vorbereitungen für die COM-DLL

Damit die Klasse später als COM-DLL verwendet werden kann, nehmen wir nun einige Einstellungen in den Projekteigenschaften vor. Dazu öffnen wir die Projekteigenschaften mit einem Rechtsklick auf das Projekt im Projektmappen-Explorer und anschließender Auswahl des Eintrags Eigenschaften aus dem nun erscheinenden Kontextmenü.

Die erste Einstellung finden wir, wenn wir im Bereich Anwendung auf die Schaltfläche Assemblyinformationen… klicken. Das öffnet den Dialog Assemblyinformationen, wo wir prüfen, ob die Option Assembly COM-sichtbar machen aktiviert ist und holen dies gegebenenfalls nach (siehe Bild 2).

Aktivieren von Assembly COM-sichtbar machen

Bild 2: Aktivieren von Assembly COM-sichtbar machen

Danach klicken wir links auf Kompilieren, um den entsprechenden Bereich einzublenden. Hier finden wir unten die Eigenschaft Für COM-Interop registrieren, die wir aktivieren (siehe Bild 3).

Aktivieren von Für COM-Interop registrieren

Bild 3: Aktivieren von Für COM-Interop registrieren

Klasse mit der Funktion zur Authentifizierung

Für den Zugriff auf die YouTube API v3 benötigen wir eine Authentifizierung, die wir mit der im Artikel YouTube-Kanal mit VB.NET verwalten, Teil 2 (www.vbentwickler.de/316) vorgestellten Klasse realisieren. Dazu fügen wir die dort beschriebene Klasse Authentication.vb in unser neues Projekt ein. Damit wir diese von einem VBA-Projekt aus nutzen können, sind jedoch einige Anpassungen nötig. Die erste ist eine tatsächliche Funktionserweiterung. Wir möchten das dabei gewonnene Token für den Zugriff auf die YouTube-API nämlich auch separat abrufen können, um gegebenenfalls einmal von einem VBA-Projekt aus direkt auf die YouTube-API zugreifen zu können.

Für den Betrieb als COM-DLL sind überdies noch weitere Änderungen nötig. Als Erstes benötigen wir einen Verweis auf den folgenden Namespace in jeder Klasse, die wir von VBA aus initialisieren und nutzen wollen:

Imports System.Runtime.InteropServices

Dies ermöglicht es uns, die zu veröffentlichenden Klassen so auszuzeichnen, dass wir von außen auf diese zugreifen können.

Schnittstelle für die Authentifizierungsklasse

Wenn wir eine Klasse einfach nach außen hin veröffentlichen, dann können wir beispielsweise von VBA aus immer noch auf einige .NET-Standard-Eigenschaften und -Methoden der Klasse zugreifen wie GetHashCode, GetType oder ToString. Wir wollen jedoch nur die von uns dafür vorgesehenen Eigenschaften und Methoden anbieten. Dazu müssen wir eine Schnittstelle erstellen, die wir dann in Form der eigentlichen Klasse implementieren.

Unsere Klasse Authentication.vb soll zwei Funktionen veröffentlichen: Die erste liefert das YouTubeService-Element und die zweite soll den beim Erstellen des YouTubeService-Elements generierten Token liefern und heißt Token. Die Schnittstelle statten wir daher genau mit der Definition dieser beiden Funktionen aus:

<InterfaceType(ComInterfaceType.InterfaceIsDual)>
Public Interface IAuthentication
     Function AuthenticateOAuth(strPathClientSecrets _
         As String) As YouTubeService
     Function Token() As String
End Interface

Wie Du siehst, zeichnen wir diese Schnittstelle mit der Annotation InterFaceType aus, der wir den Wert ComInterfaceType.InterfaceIsDual zuweisen. Was dies bedeutet, schauen wir uns in einem anderen Beitrag im Detail an.

Die Klasse Authenticate, die wir in der gleichen Datei wie die Schnittstelle IAuthenticate speichern (Authenticate.vb), findest Du in Listing 1. Diese Klasse kennzeichnen wir ebenfalls mit der Annotation ClassInterface. Für diese legen wir jedoch den Wert ClassInterfaceType.None fest. Das sorgt dafür, dass diese Klasse nicht öffentlich ist. Das ist kein Problem, denn ihre Elemente werden ja über die öffentliche Schnittstelle IAuthenticate veröffentlicht.

<ClassInterface(ClassInterfaceType.None)>
Public Class Authentication
     Implements IAuthentication
     Private _Token As String
     Public Function AuthenticateOAuth(strPathClientSecrets As String) As YouTubeService _
              Implements IAuthentication.AuthenticateOAuth
         Dim objYouTubeService As Google.Apis.YouTube.v3.YouTubeService
         Dim objUserCredential As UserCredential
         Dim objStream As FileStream
         objStream = New FileStream(strPathClientSecrets, FileMode.Open, FileAccess.Read)
         objUserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
             GoogleClientSecrets.FromStream(objStream).Secrets,
             {YouTubeService.Scope.Youtube},
             "user",
             CancellationToken.None).Result
         objYouTubeService = New YouTubeService(New BaseClientService.Initializer() With {
             .HttpClientInitializer = objUserCredential
         })
         _Token = objUserCredential.Token.AccessToken.ToString
         Return objYouTubeService
     End Function
     Public Function Token() As String Implements IAuthentication.Token
         Return _Token
     End Function
End Class

Listing 1: Definition der Klasse Authenticate.vb

Außerdem müssen wir für diese Klasse den Zusatz Implements IAuthenticate hinzufügen, damit diese die Schnittstelle implementiert. Für die einzelnen Elemente der Schnittstelle, die wir implementieren, müssen wir ebenfalls jeweils einen Zusatz zur ersten Zeile hinzufügen. Dieser enthält zusätzlich noch den Namen des Elements, das implementiert wird – für die Funktion AuthenticateOAuth lautet der Zusatz beispielsweise Implements IAuthentication.AuthenticateOAuth.

Im Vergleich zu der Version der Funktion AuthenticateOAuth, die wir im Artikel YouTube-Kanal mit VB.NET verwalten, Teil 2 (www.vbentwickler.de/316) vorgestellt haben, haben wir hier noch einen Parameter hinzugefügt. Wir wollen die Handhabung der Datei client_secrets.json, welche die Authentifizierungsdaten der App enthält, etwas ändern. Ihr Speicherort soll nicht fest im Code verdrahtet sein, sondern wir wollen diesen flexibel als Parameter übergeben. So können wir diese Datei beispielsweise auch im gleichen Verzeichnis wie die aufrufende Anwendung – beispielsweise eine Access- oder Excel-Anwendung – speichern. Wie Du die Datei client_secrets.json erhältst, lernst Du im Artikel YouTube-Kanal mit VB.NET verwalten, Teil 1 (www.vbentwickler.de/315).

Den Pfad zu dieser Datei übergeben wir der Funktion AuthenticateOAuth als Parameter und nutzen diesen dann innerhalb der Funktion zum Einlesen der benötigten Daten aus der Datei.

In AuthenticateOAuth haben wir außerdem eine Zeile hinzugefügt, welche den Wert der Eigenschaft AccessToken aus dem verwendeten UserCredential-Objekt in die lokale Variable _Token schreibt. Diesen kann die aufrufende Instanz über die Funktion Token abrufen.

Die Klasse YouTubeChannel

Die Klasse mit den Funktionen für den Zugriff auf die Daten eines YouTube-Channels haben wir YouTubeChannel genannt. Sie enthält im Wesentlichen die Elemente, die wir im Artikel YouTube-Kanal mit VB.NET verwalten, Teil 2 (www.vbentwickler.de/316) erläutert haben. Daher gehen wir hier nicht mehr im Detail auf die enthaltenen Anweisungen ein, sondern nur noch auf die notwendigen Anpassungen für die Verwendung in einer COM-DLL.

Genau wie für die Klasse Authenticate erstellen wir auch für die Klasse YouTubeChannel eine Schnittstelle. Diese sieht wie in Listing 2 aus. Auch in der Klassendatei YouTubeChannel.vb fügen wir oben einen Verweis auf den Namespace System.Runtime.InteropServices ein, damit wir die Annotationen für die Veröffentlichungen der Klasse definieren können.

Imports System.Runtime.InteropServices
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
Public Interface IYouTubeChannel
     Function GetAllVideos(strChannelID As String) As Collection
     Sub AddPlaylist(strPlaylist As String, strDescription As String)
     Sub UploadVideo(strVideoPath As String, strTitle As String, strDescription As String, _
         Optional strThumbnail As String = "")
     Sub UploadThumbnail(strThumbnail As String, strVideoID As String)
     Function GetVideo(strID As String) As MyVideo
     Sub UpdateVideo(strID As String, Optional strTitle As String = "", Optional strDescription As String = "", _
         Optional strThumbnail As String = "")
     Property PathClientSecrets As String
End Interface

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar