2016-12-15 52 views
7

Czy istnieje sposób na uzyskanie IntelliSense we własnych klasach COM w VBA?IntelliSense w niestandardowych klasach COM w VBA

E.g. W poniższym przykładzie chciałbym dostać „Number” pokazuje się, kiedy pędzę kropką (lub Ctrl + przestrzeń dla skrótu): enter image description here

Przypuszczam, jeżeli jest to jakoś rozwiązać, chciałbym również uzyskać pewne Informacje dotyczące funkcji publicznych tu obiektów:

enter image description here

zatem jakie są sugestie?

Sugestia 1:

enter image description here

Wynik - nie działa.

Wynik: To co pracował dla mnie (kod głównie z @dee): https://github.com/Vitosh/C-Sharp-Stuff/tree/master/IntSense

+1

Widziałeś [to?] (Http://stackoverflow.com/questions/684747/are-there-attributes-in-c-sharp-for-affecting-how-intellisense-displays-class-me) . – dee

+0

Pytanie brzmi "jak" iw moim przypadku nie wyświetla się wcale. – Vityata

+1

Przejdź do Przeglądarki obiektów w VBA, kliknij prawym przyciskiem myszy w panelu członków i wybierz "Pokaż ukrytych członków". Powinieneś wtedy widzieć wszystkich członków w przeglądarce obiektów, a otrzymasz Intellisense w okienkach kodu. – ThunderFrame

Odpowiedz

3

Prosty przykład mógłby wyglądać następująco.

C# klasa biblioteka o nazwie Kod IntellisenseDemo

using System; 
using System.Runtime.InteropServices; 

namespace IntellisenseDemo 
{ 
    [ComVisible(true)] 
    [Guid("41B3F5BC-A52B-4AED-90A0-F48BC8A391F1")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    public interface IIntellisenseDemo 
    { 
     int Number { get; set; } 
     string TestString(string name); 
    } 

    [ComVisible(true)] 
    [Guid("20EBC3AF-22C6-47CE-B70C-7EBBA12D0A29")] 
    [ClassInterface(ClassInterfaceType.None)] 
    [ProgId("IntellisenseDemo.Demo")] 
    public class Demo : IIntellisenseDemo 
    { 
     public int Number { get; set; } 
     public string TestString(string name) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

Uwaga: [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] wskazuje, że interfejs jest narażony na COM jako dispinterface, który umożliwia jedynie późnego wiązania.

[ClassInterface(ClassInterfaceType.None)] oznacza, że ​​CLR nie udostępnia interfejsu klasy dla tego typu. Klienci COM mogą wywoływać członków tej klasy przy użyciu metod z interfejsu IIntellisenseDemo.

regasm

C:\Windows\Microsoft.NET\Framework\v4.0.30319>regasm C:\Temp\IntellisenseDemo.dll /tlb: C:\Temp\IntellisenseDemo.tlb 

VBA

enter image description here

enter image description here

enter image description here

+0

Wygląda na coś interesującego, sprawdzę to później. Ale od pierwszego spojrzenia - czy istnieje sposób, aby zrobić to bez interfejsów i zEvents? Coś prostego? – Vityata

+1

@Vityata zobacz edytowaną odpowiedź. – dee

+0

Dzięki, działa dobrze. Jeszcze kilka pytań dotyczących twojego kodu, jeśli to możliwe. Skąd się wzięło: [ComVisible (true)] [Guid ("41B3F5BC-A52B-4AED-90A0-F48BC8A391F1")] [InterfaceType (ComInterfaceType.InterfaceIsIDispatch)] pochodzi z? Czy użyłeś skrótu do jego stworzenia? Czy ComVisible (prawda) naprawdę jest potrzebna, biorąc pod uwagę, że zaznaczam opcję "Make assembly COM-Visible" w informacji o zespole? – Vityata