Announcement

Collapse
No announcement yet.

Methoden in COM-Objekt nicht sichtbar

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methoden in COM-Objekt nicht sichtbar

    Hallo,

    wer kann mir helfen? Ich habe Schnittstellenprogramm in
    VB.NET geschrieben, das über COM angesprochen werden soll.
    Die benötigten Klassen befinden sich in einer *.dll-Datei,
    die beim Kompilieren für COM-Interop und zusätzlich beim
    Setup mit der Option vsdraCOM registriert wird. Die
    Klassen sind im OLE/COM-Viewer auch augelistet. Jedoch
    sucht man in den Type Information vergeblich nach Methoden.

    Das Schnittstellen-Programm soll auf der einen Seite von
    einem in VC6.0 geschriebenen Programm angesteuert werden.
    Ich habe das COM-Objekt bereits mit Erfolg über ein
    ebenfalls in VB.NET geschriebenes Testprogramm
    angesprochen; von der VC6.0 Seite her, lässt sich das
    Objekt jedoch nicht ansprechen. Wenn ich das gleiche
    Testprogramm in VBA schreibe erhalte ich den
    Laufzeitfehler 438: Objekt unterstützt diese Eigenschaft
    oder Methode nicht!

    Wo liegt das Problem, wie kann man Abhilfe schaffen?

    Für Lösungsvorschläge und Ratschläge wäre ich sehr dankbar!

    mfG

    Fabian Kiss

  • #2
    Hallo,

    ohne zusätzliche Eingriffe ist eine .NET-Klasse nach der COM-Interop-Umverpackung nur über die <b>späte Bindung</b> erreichbar, da nur die Methoden vom <i>IDispatch</i>-Interface für Win32-COM-Clients sichtbar sind. Erst dann, wenn die .NET-Assembly für die Assembly oder die .NET-Klasse spezielle Attribute setzt, veröffentlicht sich die .NET-Klasse für COM als Dual Interface, so dass dann auch über die frühe Bindung direkt auf alle öffentlichen Methoden der Klasse zugegriffen werden kann: <br>
    a) Assembly-Atrribut <b>ComVisible(True)</b> <br>
    b) Assembly-Attribut: <b>ClassInterface(ClassInterfaceType.AutoDual)</b>

    Beispieleinträge für <i>AssemblyInfo.cs</i> (C#):
    <pre>
    ...
    [assembly: ComVisible(true)]
    [assembly: ClassInterface(ClassInterfaceType.AutoDual)]
    ...
    </pre>
    Noch eleganter wäre es, wenn die .NET-Assembly auf das globle Veröffentlichen aller Methoden verzichtet und statt dessen die .NET-Klasse ein separat deklariertes Interface implementiert. In diesem Fall sind nur die "gewünschten" Methoden im COM-Interface sichtbar

    Comment

    Working...
    X