Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0007: COM-Komponenten mit .NET schreiben

 von 

Beschreibung

Dieses Beispiel zeigt, wie man mit .NET-Komponenten schreiben kann, die man auch von COM aus benutzen kann. Ein wichtiger Einsatzbereich dafür sind .NET-Komponenten für die Verwendung mit VB6.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [3,05 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Windows.Forms
'  - System.Drawing
'

' ##############################################################################
' ################################# Person.vb ##################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System.Runtime.InteropServices
Imports System.Windows.Forms

' <remarks>
'   Stellt eine Person dar.
' </remarks>
'
' Hier wird ein fester GUID eingetragen, damit nicht 
' nach jedem Kompilieren die Referenz
' im VB6-Projekt aktualisiert werden muss. Der GUID 
' muss eindeutig sein, ein solcher
' GUID kann beispielsweise mit dem Tool Create 
' GUID aus dem Menü Extras, GUID erstellen,
' erstellt werden.
'
<Guid("D4664B41-5F86-4f68-A1F1-F454B4F93F31"), ComVisible(True)> _
Public Class Person
    Private m_strName As String

    ' <summary>
    '   Erstellt eine neue Instanz der Klasse.
    ' </summary>
    Public Sub New()
        m_strName = "Anonymous"
    End Sub

    ' <summary>
    '   Gibt eine Meldung in einem Meldungsfeld aus.
    ' </summary>
    '
    ' In COM sichtbar.
    '
    <ComVisible(True)> _
    Public Sub SayHelloToEverybody()
        MessageBox.Show(Name & " says ""Hello World from .NET!"".")
    End Sub

    ' <summary>
    '   Gibt eine Meldung in einem Meldungsfeld aus.
    ' </summary>
    '
    ' Nicht in COM sichtbar.
    '
    <ComVisible(False)> _
    Public Sub SayHelloToEverybodyExceptCOM()
        MessageBox.Show(Name & " says ""Hello World!"".")
    End Sub

    ' <summary>
    '   Gibt den Namen der Person und den in 
    '  <paramref name="strText"/> angebenenen Gedanken
    '   zurück.
    ' </summary>
    ' <param name="strText">Gedanke der Person.</param>
    ' <returns>Text, der den Gedanken der Person enthält.</returns>
    '
    ' In COM sichtbar.
    '
    <ComVisible(True)> _
    Public Function Think(ByVal strText As String) As String
        Return Name & " thinks """ & strText & """."
    End Function

    ' <summary>
    '   Gibt den Namen der Person an oder gibt ihn zurück.
    ' </summary>
    ' <value>Name der Person.</value>
    '
    ' In COM sichtbar.
    '
    <ComVisible(True)> _
    Public Property Name() As String
        Get
            Return m_strName
        End Get
        Set(ByVal Value As String)
            m_strName = Value
        End Set
    End Property
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Unuk am 03.11.2008 um 22:06



Mit RegAsm.exe Registrieren, dann funktionierts...
Anstatt bei jeder Classe ComVisible auf True setzten kann auch im "AssemblyInfo.vb" <Assembly: ComVisible(True)> gesetzt werden.

Kommentar von FlashBFE am 13.09.2007 um 16:37

Der Tipp funktioniert leider nichtmehr bei VB2005. Die Tags funktionieren da garnicht mehr aus verschiedenen Gründen.
Man kann jetzt ne COM-DLL ins Projekt einfügen, die dann sowas erspart:

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

#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 = "47c78aae-fb9f-4013-a54f-e770f27ee339"
Public Const InterfaceId As String = "772dd32e-fa2f-4b44-963a-d2f1677a219a"
Public Const EventsId As String = "a88c5378-f5af-4df3-af62-e6ad4e01ba31"
#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
Public Sub Test()
MsgBox("Test")
End Sub
End Class


Das Problem ist: Es funktioniert bei mir nicht. Das TLB wird erzeugt und der Verweis klappt, aber wenn ich eine Instanz einer solchen Klasse erzeugen will, dann kommt ein "Automatisierungsfehler".

Kommentar von Timo am 14.08.2007 um 22:43

Hallo. Danke für den Tipp. Grundsätzlich ist für mich persönlich folgende Info einfacher umzusetzen:
+ Haken machen bei den Projekteigenschaften -> Kompilieren -> Für COM Interpop registrieren
+ Haken machen bei Projketeigenschaften -> Anwendung -> Assemblyinformation -> Assembly COM sichtbar machen.
Dann kann man in VB6 die tlb über "Verweise" integrieren.

Gruss

Timo

Kommentar von BloodySword am 10.12.2006 um 15:51

Und wie nutze ich das jetzt unter VB6? Wie krieg ich diese TLB-Datei, die in der VB6-Projektdatei gesucht wird?

Kommentar von Thomas Kitzmantl am 05.10.2005 um 13:15

Zur Frage on AJ am 09.08.2005 um 14:45:

Ich habe Events über das ComClass-Attribut freigeschalten:

<ComClassAttribute(clsNeu.ClassId, clsNeu.InterfaceId, clsNeu.EventsId)> _
Public Class clsNeu
Public Const ClassId = "44558DD7-87AD-434f-9B1B-C478233D8C69"
Public Const InterfaceId = "959A6835-4968-4cd5-89BE-7D408C2B46AA"
Public Const EventsId = "02E3954F-5DC1-4ab9-9167-354F0EC2BCA3"

'...
End Class

Kommentar von AJ am 09.08.2005 um 14:45

Wie kann ich in .NET Ereignisse hinzufügen, welche ich dann von VB6 aus abfangen kann?