Aufgrund einiger Nachfragen in meinen Schulungen will ich kurz einen Artikel zum Thema Integration von neuen, .net basierenden Lösungen in bestehende Systeme aufzeigen. In meinem Beispiel werde ich ein .NET Assembly erzeugen welches ich dann im COM Katalog registriere um dann das Assembly in Visual Basic 6 verwenden zu
können. Der Vorteil sollte hier klar ersichtlich sein: Sie können neue Logiken in der neuen Technologie entwickeln, und dabei trotzdem abwärtskompatibel bleiben.
Erzeugen des .NET Assemblies
In Visual Studio .NET wähle ich im Menü Visual Basic ein Klassenbibliotheksprojekt und füge eine neue Komponenten Klasse hinzu welche ich später aus Visual Basic 6 heraus auch benutzen kann. Als nächstes importiere ich den Namespace System.Runtime.InteropServices um Zugriff auf ComVisibleAttribute
zu erhalten. Mit diesem Attribute kann ich die einzelnen Bestandteile der Klasse welche ich nach COM veröffentlichen will auszeichnen, so dass aus COM heraus das .NET Assembly auch angesprochen werden kann. <ComVisible(True)> setze ich nun einmal auf Ebene der Klasse selbst und auf die Methoden welche aus COM
heraus aufrufbar sein sollen.
Imports System.Runtime.InteropServices <ComVisible(True)> _ Public Class Component1 Inherits System.ComponentModel.Component #Region " Component Designer generated code " Public Sub New(ByVal Container As System.ComponentModel.IContainer) MyClass.New() 'Required for Windows.Forms Class Composition Designer support Container.Add(Me) End Sub Public Sub New() MyBase.New() 'This call is required by the Component Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Component overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Component Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Component Designer 'It can be modified using the Component Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() components = New System.ComponentModel.Container End Sub #End Region <ComVisible(True)> _ Public Sub SagHallo() System.Windows.Forms.MessageBox.Show("Hallo aus Visual Basic .NET!") End Sub <ComVisible(True)> _ Public Function Uhrzeit() As DateTime Return DateTime.Now().ToLocalTime() End Function <ComVisible(True)> _ Public Function Datum() As String Return DateTime.Now().Date.ToLongDateString() End Function End Class |
Erzeugen eines StrongName
Im .NET Framework haben wir ja nun endlich die Probleme des COM
Systems und der Registry überwunden in dem sämtliche
Metainformationen nicht mehr in der Registry sondern in den .NET
Assemblies selbst gespeichert werden. Damit haben wir in .NET die
Möglichkeit der so genannten "Side-by-Side Execution". Genug
geschwafelt. Wichtig ist das im klassischen COM Katalog eine
Komponente nur hinterlegt(registriert) werden kann, wenn diese
Komponente eine eindeutige ID hat (CLSID). In .NET ist das
normalerweise nicht nötig kann aber über das .NET Framework Tool
sn.exe nachgeholt werden. Gehen Sie also in die Kommandozeile,
wechseln Sie in das Projektverzeichnis und rufen Sie sn.exe -k
IhrName.snk auf. Im Solution Explorer klicken Sie doppelt auf die
AssemblyInfo.vb Datei und fügen Sie folgenden Eintrag hinzu:
<Assembly: AssemblyKeyFile("ProjektPfadIhrName.snk")>
Nun haben Sie zwei Möglichkeiten zu Verfügung wie das .NET Assembly
in COM Registriert werden soll. Entweder Sie registrieren das
Assembly im COM Katalog über Visual Studio .NET oder Sie
registrieren das Assembly manuell.
Visual Studio bietet sich an, wenn sie alles auf einem Rechner
haben. Dies können Sie über die Projekteigenschaften im Solution
Explorer unter dem Punkt BUILD durch aktivieren der CheckBox
"Register for COM Interop" erreichen. Bei einer finalen Version
müssen Sie wohl oder übel eine Setuproutine erzeugen welche das
Assembly registriert. Wir werden den manuellen Weg beschreiten und
diese CheckBox deaktivieren.
Kompilieren Sie nun das .NET Projekt
Erzeugen einer TLB für das Assembly
Was wir nun benötigen sind die Type Informationen für die
Komponente um diese im COM Katalog hinerlegen zu können.
Dies kann man erreichen durch das .NET Framework Tool TlbExp.exe.
Das Tool erzeugt dabei Type Informationen des .NET Assemblies, um
COM Anwendungen (in unserem Fall VB6) auf diese Typen zugreifen zu
können.
In der Kommoandzeile geben Sie ein:
TlbExp.exe IhreKomponente.dll
Registrieren des TLB im COM Katalog
Das Registrieren einer COM Komponente unter Visual Basic 6 oder
Visual C++ 6 ging im WinDNA Zeitalter über das altbekannte
Regsvr32.exe. Im .NET Framework gibt es nun eine neue Executable
namens RegAsm.exe welche im Grunde dieselbe Funktionalität wie
Regsvr32.exe bietet, jedoch für .NET Assemblies. RegAsm.exe bietet
Ihnen jedoch auch die Möglichkeit den Schritt Erzeugen einer TLB
für das Assembly gleich mitzuerledigen.
Registrieren eines Assemblies in COM:
RegAsm.exe IhreKomponente.dll
Registrieren eines Assemblies, erzeugen einer TLB und registrieren
derselben:
RegAsm.exe IhreKomponente.dll /tlb:IhreKomponente.tlb
Ich persönlich empfehle Ihnen die zweite Methode.
Verwenden des .NET Assemblies aus VB 6 oder Excel heraus
Nachdem Sie das Assembly mit RegAsm registriert haben, können Sie die .NET Komponente aus zum Beispiel Visual Basic 6 oder VBA heraus benutzen. Gehen Sie in das Verweise Menü von VB oder VBA und setzen Sie einen Verweis, entweder manuell auf die TLB, falls Sie die TLB manuell mittels TlbExp.exe erzeugt haben oder wählen Sie das .NET Assembly aus der Liste der verfügbaren Komponenten aus wenn Sie die TLB über RegAsm.exe erzeugt haben.
Danach können Sie im Quellcode die .NET Assembly benuten. Was jedoch ein bisschen "Fad' im Gschmak' is" wie man bei uns in Bayern sagt, ist der Fakt das IntelliSense dabei weder in VB6 noch in VBA funktioniert.
Public Sub Test() Dim myObject As New clNET_VB6.Component1 myObject.SagHallo Dim strDate As String Dim strTime As Date strDate = myObject.Datum strTime = myObject.Uhrzeit MsgBox (strDate & vbCrLf & strTime) End Sub |