Auf COM-Methoden in VBA kann nicht zugegriffen werden

8

Ich versuche COM-exponierten Methoden in VBA zuzugreifen.

Problem: Ich sehe alle Standardmethoden (wie GetHashCode , GetType und ToString ) in VBA, aber nicht die, die Teil der COM-Schnittstelle und speziell geschrieben, um COM sichtbar zu sein (wie getStringValue() unten).

Einrichtungsdetails:

  • Visual Studio 2008
  • Windows 7 x64
  • Büro 2007
  • .NET 3.5

Schnittstelle 'IGetMyString.cs'

%Vor%

Implementierung 'GetMyString.cs'

%Vor%

In den Build-Eigenschaften habe ich 'Make Assembly COM Visible sichtbar gemacht' (siehe unten)

Außerdem wurde Visual Studio 2005 aufgefordert, das 'Registrieren für COM-Interop' zu aktivieren (siehe unten)

Und schließlich, als ein Postbuildereignis, führe ich die regasm.exe aus, um die .DLL und auch die .TLB Registrierung wie folgt zu registrieren:

%Vor%

In der Excel-Objekt-Explorer-Ansicht habe ich den COM-Server (SimpleCOMAssembly oben geschrieben) aktiviert, und jetzt im Objekt-Explorer wird die COM-Interface-Methode nicht aufgelistet (siehe unten)

Kann mir jemand helfen zu wissen, was ich vermisse, was dazu führt, dass die Methoden der COM-Schnittstelle nicht in VBA angezeigt werden?

BEARBEITEN ITypeLib-Ansicht des generierten TLB anhängen

    
peakit 13.05.2012, 20:28
quelle

3 Antworten

4

Der Screenshot des Excel-Objektbrowsers zeigt ein Problem. Beachten Sie, wie die Methoden GetHashcode, GetType und ToString angezeigt werden. Dies sind Methoden, die von System.Object geerbt werden. Aber Ihr Snippet verwendet explizit (und korrekt) [ClassInterface (ClassInterfaceType.None)], so dass die Klassenimplementierung ausgeblendet ist.

Es ist nicht versteckt. Nicht so sicher, wie das passierte, könnte eine alte Typbibliothek von einem früheren Versuch es erklären. Aber Ihre Build-Schritte sind sehr suspekt, Sie helfen zu viel. Die Option "Assembly-Typen COM sichtbar machen" ist eine ziemlich grobe Methode, um das Build-System zu zwingen, .NET-Typen verfügbar zu machen. Aber Ihr Code verwendet die raffinierte oben rechts-Pinky-up-wenn-Sie-trinken-Tee Weg, um Typen zu COM zu offenbaren. Dazu gehören das Attribut [ComVisible (true)], das Kontrollkästchen und das [ClassInterface] -Attribut, was das Kontrollkästchen nicht tut.

Das Problem ist also, dass Sie das Build-System gebeten haben, zwei Schnittstellen zu implementieren. Was auch immer es von der Basisklasse geerbt hat, _Object in Ihrem Fall, plus was es von der Deklaration geerbt hat, IMyGetString in Ihrem Fall. Was in Ordnung ist und alles ganz COM-kompatibel, aber VBA ist kein sehr guter COM-Consumer. Es mag nur die [Default] -Schnittstelle und das ist _Object in Ihrem Fall. Deutlich sichtbar vom Screenshot.

Deaktivieren Sie also die Option "Assembly COM sichtbar machen".

Wählen Sie zwischen einem Postbuild-Ereignis, das Regasm aufruft, oder dem Kontrollkästchen "Für COM-Interop registrieren". In beiden Fällen verdoppelt sich die Wahrscheinlichkeit, dass Sie nicht wissen, warum es nicht funktioniert. Sie benötigen den Postbuild nur, wenn Sie die Assembly für die 64-Bit-Version von Office registrieren müssen.

    
Hans Passant 13.05.2012, 20:39
quelle
2

Ich hatte das gleiche Problem. Ich habe diesen Link gefunden.

Anleitung zum Aufruf einer .net-Bibliothek von Excel Wenn ich auf eine TLB-Datei mit dem Namen "Foo.tlb" verweise, die eine Klasse namens "FooClass" hat, die öffentliche Mitglieder hat. Sie können diese Member nicht sehen, da sie standardmäßig nur mit der Schnittstelle für die späte Bindung (Laufzeitbindung) erstellt werden.

Sie können Ihre Klasse ändern, um eine frühe Bindung zu haben, die ermöglicht, dass Intellisense und die Mitglieder der Klasse im Objektbrowser verfügbar gemacht werden.

C #:

%Vor%

Sie sollten die DoSomething-Methode im Objektbrowser anzeigen können, nachdem Sie diese Änderung implementiert haben. Hinweis: Sie müssen die DLL zuerst ablehnen.

    
workingobrien 17.01.2013 20:34
quelle
1

Für die Aufzeichnung - falls jemand diese Antwort benötigt - ich hatte genau das gleiche Problem (OLEView und alles) und es hat mich verrückt gemacht. Ich konnte nicht herausfinden, was ich falsch gemacht habe, weil ich vorher mehrere C # COMs erstellt habe. Ich habe vergessen, die Schnittstelle (in diesem Beitrag, der IGetMyString wäre) als public zu deklarieren.

Hoffe, das spart jemandem Zeit.

    
transistor1 12.11.2012 14:57
quelle

Tags und Links