C#-DLL für COM/VBA erstellen

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Das .NET-Framework bietet im Vergleich zu VBA eine schier unendliche Menge nutzbarer Bibliotheken mit Objekten, Methoden und Eigenschaften für die verschiedensten Anwendungsfälle. Wer noch nicht komplett auf eine .NET-Anwendung umsteigen möchte, mag sich aber vielleicht die Möglichkeiten des Frameworks unter VBA erschließen. Dazu programmieren Sie eine DLL-Bibliothek, welche die benötigen .NET-Elemente enthält und für externe Anwendungen wie etwa eine Access-Datenbank bereithält. Der vorliegende Artikel erklärt, wie dies funktioniert.

Grundlagen

Wenn es darum geht, von einem VBA-Projekt etwa auf die Methoden einer mit C# programmierten DLL zuzugreifen, benötigen Sie eine Technologie namens COM (Component Object Model). Diese wurde von Microsoft bereits vor einer ganzen Weile eingeführt, nämlich in den frühen neunziger Jahren. Das Ziel war, dass Komponenten, die mit verschiedenen Programmiersprachen programmiert wurden, miteinander kommunizieren können.

COM liefert die Vorgaben für die Schnittstellen, die diese Interaktion ermöglichen. Damit nun auch noch Komponenten, die auf .NET basieren, mit COM-Objekten zusammenarbeiten, gibt es eine weitere Technologie, die sich COM Interop nennt. Diese erlaubt es beispielsweise, die in einer .NET-DLL definierten Objekte, Methoden und Eigenschaften auch für eine COM-Komponente zugänglich zu machen.

Eine .NET-Komponente ist beispielsweise eine DLL-Datei. Damit Sie von COM-Objekten auf diese DLL-Datei zugreifen können, müssen Sie zunächst eine COM-Type Library (.tlb) erstellen, welche die relevanten Informationen bereithält. Dies erledigen Sie mit einem Befehlszeilentool namens REGASM.EXE oder TLBEXP.EXE.

Wichtig: Admin-Modus!

Wenn Sie eine DLL erstellen und registrieren möchten, müssen Sie Visual Studio als Administrator ausführen. Dazu klicken Sie mit der rechten Maustaste auf den Visual Studio-Eintrag, der beispielsweise erscheint, wenn Sie im Suchfeld den Suchbegriff Visual Studio eingeben. Im folgenden Kontextmenü wählen Sie den Eintrag Als Administrator ausführen aus (siehe Bild 1). In diesem Modus können die notwendigen Registry-Einträge gesetzt werden.

Visual Studio als Administrator starten

Bild 1: Visual Studio als Administrator starten

Stolperfalle: DLL in Verwendung

Sollten Sie die DLL bereits einmal erstellt haben, wollen Sie diese natürlich im VBA-Projekt einer Access-Anwendung testen. Wenn Sie die DLL etwa per Verweis referenzieren und die Datenbank geöffnet ist, kann die referenzierte DLL nicht überschrieben werden, da diese schreibgeschützt ist. Sollten Sie das C#-Projekt mit der DLL zu diesem Zeitpunkt also in Visual Studio editieren und neu erstellen wollen, gelingt dies nicht, da die DLL ja nicht überschrieben werden kann. Dies erfahren Sie dann auch im Bereich Fehlerliste (siehe Bild 2).

Fehler beim Versuch, eine aktuell in Verwendung befindliche DLL neu zu erstellen

Bild 2: Fehler beim Versuch, eine aktuell in Verwendung befindliche DLL neu zu erstellen

Also, auch wenn es mit der Zeit nervt: Nicht vergessen, die Anwendung, mit der Sie die DLL testen, vor dem Neuerstellen der DLL zu schließen. Aber: Es gibt eine einfachere Methode, die wir weiter unten nach der Erstellung des ersten Beispiels erläutern.

DLL erstellen

Um eine DLL zu erstellen, deren Funktionen Sie später von einem VBA-Projekt nützen können, legen Sie in Visual Studio ein Projekt auf Basis der Vorlage Klassenbibliothek an (siehe Bild 3). Ändern Sie den Namen der automatisch hinzugefügten Klassendatei namens Class1 in LateBinding um und erledigen Sie dies auch für den Klassennamen selbst.

Hinzufügen eines Projekts, das wir als DLL verwenden können

Bild 3: Hinzufügen eines Projekts, das wir als DLL verwenden können

Danach fügen Sie dem Klassenmodul den folgenden einfachen Code hinzu. Die Klasse deklariert zwei Variablen namens zahl1 und zahl2, die über die Eigenschaften Zahl1 und Zahl2 gefüllt werden sollen. Die Methode Produkt soll dann das Produkt der beiden Zahlen zurückliefern:

namespace DLLFuerVBA {
     public class NoIntelliSense {
         int zahl1;
         int zahl2;
         public int Zahl1 {
             set { zahl1 = value; }
         }
         public int Zahl2 {
             set { zahl2 = value; }
         }
         public int Produkt() {
             return zahl1 * zahl2;
         }
     }
}

Dass wir die Klasse NoIntelliSense nennen, hat seinen Grund – mehr dazu weiter unten.

Der Clou ist nun, dass diese Klasse nicht innerhalb des C#-Projekts genutzt werden soll, sondern von einem VBA-Projekt in einer Access-Anwendung. Dazu sind zwei bereits durchgeführte und noch zwei weitere Schritte notwendig:

  • Der erste bereits erledigte Schritt ist, dass die Klassendefinition als Public deklariert wird.
  • Der zweite Schritt war, dass auch die Member der Klasse, die von außen erreicht werden sollen, das Schlüsselwort Public enthalten.
  • Der dritte Schritt ist, dass Sie die Option Für COM-Interop registrieren aktivieren (siehe weiter unten).
  • Der vierte Schritt ist das Aktivieren der Option Assembly COM-sichtbar machen (siehe ebenfalls weiter unten).

Für COM-Interop registrieren

Die Option Für COM-Interop registrieren finden Sie, wenn Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen klicken, den Eintrag Eigenschaften anklicken und im dann erscheinenden Fenster zum Bereich Erstellen wechseln. Unten unter Ausgabe finden Sie die gesuchte Option, die Sie per Klick auf das Kontrollkästchen aktivieren (siehe Bild 4). Wenn Sie diese Option nicht aktivieren, erstellt Visual Studio beim Erstellen des Projekts im Unterordner \bin\debug nur die übliche .dll-Datei plus einer .pdb-Datei. Damit Sie die DLL von einem VBA-Projekt aus nutzen können, müssen Sie diese jedoch entsprechend registrieren. Das können Sie auf zwei Arten erledigen – entweder mit einem Kommandozeilentool oder durch die Aktivierung der obigen Option vor dem Erstellen des Projekts. Dabei werden zwei Schritte durchgeführt: Visual Studio erstellt eine weitere Datei mit der Endung .tlb, welche die Definition der Schnittstelle enthält, die Sie später vom VBA-Projekt aus nutzen können. Außerdem legt Visual Studio auch gleich einige Einträge in der Registry an, damit Sie die Bibliothek über den Verweise-Dialog des VBA-Editors auswählen können.

Einstellen der Option Für COM-Interop registrieren

Bild 4: Einstellen der Option Für COM-Interop registrieren

Assembly COM-sichtbar machen

 

Schreibe einen Kommentar