DevTrain

Autor: Tobi Ulm

.NET Assemblies in COM

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


Erfasst am: 07.01.2003 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=817
© Copyright 2003 ppedv AG - http://www.ppedv.de