COM-Interopability

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von MasterQ.

    COM-Interopability

    Moins,

    ich erstellen eine DLL in VB.NET für die Verwendung mit MSAccess. Dabei sind die Klassen als COM-Klassen anzulegen.

    Ich schaue mir grade an, wie das mit C# funktioniert. Ich denk nicht viel anders, oder?

    Wenn ich im C#-Project auf Element hinzufügen gehe wird mir da kein Typ COM-Klasse angeboten. Das geht natürlich auch zu Fuß nur würden so die GIDs automatisch erzeugt. Vielleicht habe ich auch den falschen Typ an Klassenbibliothek ausgewählt. "Klassenbibliotek" erscheint auch mehrmals in der Auswahlliste bei der Projekterstellung. Ich habe Klassenbibliothek (.NET Framework) für C#, Windows, DLL ausgewählt. aber auch wenn ich andere Typen an Klassenbibliotheken auswähle, gibt es keine Elementvorlage für eine COM-Klasse.

    Kann mich da jemand aufklären.

    Gruß

    MQ
    @MasterQ Geh mal in die Projekteigenschaften und mach da nen Haken bei Für COM Interop registrieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Im Gegensatz zu VB scheint es bei C# über ein Interface zu laufen. Ich habe selber bis jetzt nur in VB solchen Klassen erstellt und hab hier leider keine praktische Erfahrung.
    Siehe: docs.microsoft.com/de-de/dotne…interop/example-com-class

    @RodFromGermany In VB gibt es eine Standardvorlage mit passendem Attribut und bereits vorbelegten GUIDS siehe:
    docs.microsoft.com/de-de/dotne…ough-creating-com-objects

    Sieht dann so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
    2. Public Class ComClass1
    3. #Region "COM-GUIDs"
    4. ' Diese GUIDs stellen die COM-Identität für diese Klasse
    5. ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
    6. ' Clients nicht mehr auf die Klasse zugreifen.
    7. Public Const ClassId As String = "4ec9865e-1a8a-452f-ad3b-8b5438f10f62"
    8. Public Const InterfaceId As String = "6d66c32c-3dbb-4f8d-af89-bc9d532a37f3"
    9. Public Const EventsId As String = "ce5ea050-2399-4ec4-a598-9ce256d5ac75"
    10. #End Region
    11. ' Eine erstellbare COM-Klasse muss eine Public Sub New()
    12. ' ohne Parameter aufweisen. Andernfalls wird die Klasse
    13. ' nicht in der COM-Registrierung registriert und kann nicht
    14. ' über CreateObject erstellt werden.
    15. Public Sub New()
    16. MyBase.New()
    17. End Sub
    18. End Class

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

    korni schrieb:

    Im Gegensatz zu VB scheint es bei C# über ein Interface zu laufen. Ich habe selber bis jetzt nur in VB solchen Klassen erstellt und hab hier leider keine praktische Erfahrung.

    Da hatte ich reingeschaut. Wie immer, ist Cx (x=++ oder #) deutlich komplizierter als BASIC. Zu exportierende Klassen sind in Section interfaces einzutragen, ähnliches gilt für Events, ... VB.NET ist da doch "übersichtlicher"


    @RodFromGermany In VB gibt es eine Standardvorlage

    Yepp und für C# scheint es eben keine solche Vorlage zu geben. Zumindest habe ich sie nicht gefunden bzw. wird nicht angezeigt.

    Also doch alles zu Fuß. :(

    Gruß

    MQ
    naja - soo viel zu tun ist das ja auch nicht, odr?
    Wenn man das generierte Geschwafel entfernt verbleibt:

    VB.NET-Quellcode

    1. <ComClass("4ec9865e-1a8a-452f-ad3b-8b5438f10f62", "6d66c32c-3dbb-4f8d-af89-bc9d532a37f3", "ce5ea050-2399-4ec4-a598-9ce256d5ac75")>
    2. Public Class ComClass1
    3. Public Sub New()
    4. ' Eine COM-Klasse muss eine parameterlose Public Sub New() haben, sonst wird sie nicht registriert.
    5. MyBase.New()
    6. End Sub
    7. End Class
    Wobei natürlich für die Guids mit dem VS-Guid-Tool für jede ComClass spezifische Guids zu erzeugen sind und da einzutragen.
    nee, viel ist das nicht. Dein Beispiel bezieht sich auch auf VB.NET.

    Ich versuche mich aber grade an C#! Und da scheint das alles etwas komplizierter. Da ist das händische Generieren der GUIDs noch das kleinste Übel. Am Ende wird's aber nicht wirklich aufwendig werden, hoffe ich ;) Da habe ich wesentlich mehr Probleme mit dem Weg andersrum, d.h. eine "normale" C++ DLL in mein VB.NET Projekt einbinden. Das ist mir noch nicht gelungen.

    Gruß

    MQ