Hallo liebe Community,
wenn ihr, so wie ich, gezwungen seit in VBA zu arbeiten, aber (fast) alle Funktionen und Feinheiten des NET-Frameworks nutzen möchtet, dann ist COM genau das richtige für euch.
Zuerst noch ein kleiner Hinweis: Eine DLL COM-verfügbar machen ist nicht immer einfach und erfordert etwas an umdenken, aber mit etwas Übung weiß man schnell was man machen kann und was nicht.
Dieses Tutorial beschäftigt sich mit der Erstellung einer COM-DLL von Grund auf (ohne VS-Vorlage) und ist somit auch in den Express Versionen möglich.
Aufbau:
Im Großen und Ganze gibt es zwei Möglichkeiten eine COM-DLL zu erstellen. Mit automatisch oder mit manuell generierter Schnittstelle. Heute werde ich die Methode mit der automatisch generierten Schnittstelle erklären, weil ich diese etwas leichter finde.
Zuerst erstellen wir ein normales DLL Projekt. Dieses nennen wir "MeineErsteCOM_DLL"

Gleich danach öffnen wir die Projekteinstellungen. Unter "Anwendung -> Assemblyinformationen..." aktivieren wir das Häkchen bei "Assembly COM-sichtbar machen".

Nun erstellen wir noch ein Schlüsselpaar, damit wir die DLL auch signieren können. Dazu öffnen wir die VisualStudio-Eingabeaufforderung und navigieren in das Projektverzeichnis. Mit dem sn-Befehl können Schlüssel erstellt werden. z.B.:
Um die DLL zu signieren, gehen wir wieder in die Projekteigenschaften Signierung, aktivieren das Häkchen bei "Assembly signieren" und wählen das soeben erstellte Schlüsselpaar aus (MeinSchluessel.snk).
Das war es schon fast mit der Vorbereitung. Nur noch ein letzter Schritt.
Das Grundgerüst:
Das Grundgerüst der COM-Klasse ist dafür verantwortlich, dass wir später unsere Klasse sowei deren Member in VBA zu Gesicht bekommen. Jede Klasse in der DLL die COM-Verfügbar gemacht werden soll, muss dementsprechend ein eigenes Grundgerüst enthalten.
Zuerst kommt das ComClass-Attribut welches angibt, dass diese Klasse eine COM-Klasse ist. Das Attribut nimmt drei Parameter entgegen. Jeder dieser drei Parameter muss eine Konstante GUID sein und wird direkt in der Klasse durch Konstanten angegeben.
Dadurch wird sichergestellt dass keine COM-DLL doppelt vorkommt. Diese müssen ab dem ersten Erstellen immer gleich bleiben.
Darunter steht wie bei einer normalen Klasse der Klassenname.
In der Region "COM-GUIDs" werden die oben genannten Konstanten definiert. Hier muss bei jeder neue Klasse eine neue Guid erstellt werden.
Danach folgt noch der Parameterlose Konstruktor, der mit MyBase.New() die Klasse initialisiert. COM-Klassen können nur über ein parameterloses "Sub New()" aufgerufen werden.
Hinweis: Konstruktoren mit Parametern können trotzdem hilfreich sein, falls die Klasse auch in .NET verwendet wird!
Neue Funktionen
Damit die Klasse nun auch wirklich COM-Sichtbar werden kann, muss auch noch mindestens eine öffentliche Methode oder Eigenschaft definiert werden.
Hierzu fügen wir folgenden Code ein:
Zum Schluss muss die DLL nur noch erstellt und registriert werden. Das erstellen erfolgt wie bei jeder anderen DLL auch, mit einem Klick auf Erstellen
Das Registrieren geht am schnellsten über die VisualStudio-Eingabeaufforderung. Wir navigieren in den Ordner in dem die DLL liegt und registrieren diese mit dem Befehl RegAsm:
Bei Erfolg sollte die Ausgabe von RegAsm ungefähr so aussehen:
Wenn man nun VBA öffnet (z.B.: in Excel) und einen neuen Verweis hinzufügt, sollte unsere soeben erstellte DLL in der Liste vorhanden sein. Diese aktivieren wir erst mal.

Nun können wir in VBA auf die Klasse zugreifen sowie deren Methoden nutzen:
Zum Schluss noch ein Paar wichtige Hinweise:
wenn ihr, so wie ich, gezwungen seit in VBA zu arbeiten, aber (fast) alle Funktionen und Feinheiten des NET-Frameworks nutzen möchtet, dann ist COM genau das richtige für euch.
Zuerst noch ein kleiner Hinweis: Eine DLL COM-verfügbar machen ist nicht immer einfach und erfordert etwas an umdenken, aber mit etwas Übung weiß man schnell was man machen kann und was nicht.
Dieses Tutorial beschäftigt sich mit der Erstellung einer COM-DLL von Grund auf (ohne VS-Vorlage) und ist somit auch in den Express Versionen möglich.
Aufbau:
Im Großen und Ganze gibt es zwei Möglichkeiten eine COM-DLL zu erstellen. Mit automatisch oder mit manuell generierter Schnittstelle. Heute werde ich die Methode mit der automatisch generierten Schnittstelle erklären, weil ich diese etwas leichter finde.
Zuerst erstellen wir ein normales DLL Projekt. Dieses nennen wir "MeineErsteCOM_DLL"
Gleich danach öffnen wir die Projekteinstellungen. Unter "Anwendung -> Assemblyinformationen..." aktivieren wir das Häkchen bei "Assembly COM-sichtbar machen".
Nun erstellen wir noch ein Schlüsselpaar, damit wir die DLL auch signieren können. Dazu öffnen wir die VisualStudio-Eingabeaufforderung und navigieren in das Projektverzeichnis. Mit dem sn-Befehl können Schlüssel erstellt werden. z.B.:
Um die DLL zu signieren, gehen wir wieder in die Projekteigenschaften Signierung, aktivieren das Häkchen bei "Assembly signieren" und wählen das soeben erstellte Schlüsselpaar aus (MeinSchluessel.snk).
Das war es schon fast mit der Vorbereitung. Nur noch ein letzter Schritt.
Das Grundgerüst:
Das Grundgerüst der COM-Klasse ist dafür verantwortlich, dass wir später unsere Klasse sowei deren Member in VBA zu Gesicht bekommen. Jede Klasse in der DLL die COM-Verfügbar gemacht werden soll, muss dementsprechend ein eigenes Grundgerüst enthalten.
VB.NET-Quellcode
- <ComClass(MeineComKlasse.ClassId, MeineComKlasse.InterfaceId, MeineComKlasse.EventsId)> _
- Public Class MeineComKlasse
- #Region "COM-GUIDs"
- ' Diese GUIDs stellen die COM-Identität für diese Klasse
- ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
- ' Clients nicht mehr auf die Klasse zugreifen.
- Public Const ClassId As String = "13880b56-4717-43f3-8ff4-8853d4916752"
- Public Const InterfaceId As String = "ba1c5a43-8a27-476d-862d-049da97ce808"
- Public Const EventsId As String = "2b4ad47f-4a11-4a57-9a33-1544c74eee36"
- #End Region
- ' Eine erstellbare COM-Klasse muss eine Public Sub New()
- ' ohne Parameter aufweisen. Andernfalls wird die Klasse
- ' nicht in der COM-Registrierung registriert und kann nicht
- ' über CreateObject erstellt werden.
- Public Sub New()
- MyBase.New()
- End Sub
- End Class
Zuerst kommt das ComClass-Attribut welches angibt, dass diese Klasse eine COM-Klasse ist. Das Attribut nimmt drei Parameter entgegen. Jeder dieser drei Parameter muss eine Konstante GUID sein und wird direkt in der Klasse durch Konstanten angegeben.
Dadurch wird sichergestellt dass keine COM-DLL doppelt vorkommt. Diese müssen ab dem ersten Erstellen immer gleich bleiben.
Darunter steht wie bei einer normalen Klasse der Klassenname.
In der Region "COM-GUIDs" werden die oben genannten Konstanten definiert. Hier muss bei jeder neue Klasse eine neue Guid erstellt werden.
Danach folgt noch der Parameterlose Konstruktor, der mit MyBase.New() die Klasse initialisiert. COM-Klassen können nur über ein parameterloses "Sub New()" aufgerufen werden.
Hinweis: Konstruktoren mit Parametern können trotzdem hilfreich sein, falls die Klasse auch in .NET verwendet wird!
Neue Funktionen
Damit die Klasse nun auch wirklich COM-Sichtbar werden kann, muss auch noch mindestens eine öffentliche Methode oder Eigenschaft definiert werden.
Hierzu fügen wir folgenden Code ein:
Zum Schluss muss die DLL nur noch erstellt und registriert werden. Das erstellen erfolgt wie bei jeder anderen DLL auch, mit einem Klick auf Erstellen
Das Registrieren geht am schnellsten über die VisualStudio-Eingabeaufforderung. Wir navigieren in den Ordner in dem die DLL liegt und registrieren diese mit dem Befehl RegAsm:
Bei Erfolg sollte die Ausgabe von RegAsm ungefähr so aussehen:
Wenn man nun VBA öffnet (z.B.: in Excel) und einen neuen Verweis hinzufügt, sollte unsere soeben erstellte DLL in der Liste vorhanden sein. Diese aktivieren wir erst mal.
Nun können wir in VBA auf die Klasse zugreifen sowie deren Methoden nutzen:
Zum Schluss noch ein Paar wichtige Hinweise:
- VBA kennt keine generischen Typen
- Die Übergabe von Arrays eines eigenen Typen von VB.NET an VBA, funktioniert nicht immer reibungslos. Hier sollte man die Elemente einzeln über den Index holen.
- Die Übergabe eines eigenen Typ von VBA an VB.NET funktioniert nur über ByRef. In diversen Fällen funktioniert dies auch nicht. In diesem Fall kann man die Übergabewerte vom Typ Object machen und diese in VB.NET richtig Casten.
- VBA unterstützt keine Überladung von Methoden
SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=
Weil einfach, einfach zu einfach ist!
Weil einfach, einfach zu einfach ist!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BiedermannS“ ()