Respuesta bastante simple, creo, pero parece que no puedo encontrar una respuesta directa. Puedo ver mucho sobre el tema, pero nada que aborde este tema en particular (ver abajo la respuesta más cercana que pude encontrar)

Creé un .dll usando vb.net y lo importé para usarlo en Excel sin problemas. Cuando I dim y set una instancia de esta clase, intellisense recoge la biblioteca y el nombre de la clase, pero a partir de ahí no se muestran los nombres de función / variable o subrutina. Las rutinas y las variables se compilan y se ejecutan totalmente bien, pero me gustaría que esta biblioteca sea utilizable por otros, por lo que intellisense sería extremadamente útil.

Código de ejemplo en VB.net:

Namespace wtf
    Public Class samplerJam
        Public jjj As String
        Public Sub method1()
            jjj = "Hello"
        End Sub
    End Class
End Namespace

¿Me estoy perdiendo algo realmente simple?

(encontrado esta respuesta a una pregunta similar pero de acuerdo con esa configuración, debería poder ver mis subs / funciones)

2
jamheadart 17 jun. 2017 a las 02:48

2 respuestas

La mejor respuesta

Esto puede ser un poco tarde para la fiesta, pero me topé con esta pregunta al tratar de abordar algo similar en VB.NET, así que espero que esto pueda ayudarlo a usted / alguien en el futuro.

Intellisense

En términos de abordar el aspecto intellisense, su respuesta original funcionará. Sin embargo, mi método implica el uso de un GUID.

Digamos que tengo una clase llamada Foo que quiero exponer a Excel / Access. Crearé un Interface implementado por Foo:

Public Interface IFoo
    Function HelloWorld() As String
End Interface

Public Class Foo
    Implements IFoo

    Public Function HelloWorld() As String Implements IFoo.HelloWorld
        Return "Hello World!"
    End Function
End Class

Como puede ver, Foo tiene una función llamada HelloWorld que se declara en la interfaz, que se implementa en la clase.

Así que ahora, para asegurarnos de obtener esto en el intellisense, podemos agregar algunos atributos a nuestra interfaz / clase para exponerlos a Excel. Mi interfaz cambia de la siguiente manera:

<ComVisible(True)>
<Guid("2055A907-9D7A-4DC9-A46B-6E283713A5AB")>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
Public Interface IFoo
    Function HelloWorld() As String
End Interface

Y mi clase cambiará a ...

<ComVisible(True)>
<Guid("2C4D41A7-235E-4F48-BE99-62118B2852A7")>
<ClassInterface(ClassInterfaceType.None)>
<ProgId("Foo")>
Public Class Foo
    Implements IFoo

    Public Function HelloWorld() As String Implements IFoo.HelloWorld
        Return "Hello World!"
    End Function
End Class

Para generar un GUID, puede utilizar algunos pasos sencillos en Visual Studio. Herramientas> Crear GUID> Opción 6 para VB.NET o 5 para C#.

¡Su DLL ahora está lista para usar con intellisense!

Registro en la máquina de destino

Potencia Shell

Este proceso es manual, está bien si lo haces una vez en una luna azul / solo tienes 1 máquina objetivo más allá de la tuya.

Desea ubicar la carpeta .NET que corresponde con la versión de .NET que utilizó para construir su DLL. Suponiendo que esté utilizando al menos .NET 4.0+, estará aquí:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\

Necesita usar Regasm para registrar el dll.

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\
.\RegAsm.exe PathToYourDLL\DLLName.dll

Tenga en cuenta que si su ruta contiene espacios use "comillas" alrededor de la ruta del archivo

Crear un MSI

Si tiene algunas máquinas de destino, podría ser más fácil crear un MSI para realizar el registro por usted.

Puede descargar una extensión de Microsoft Marketplace (https://marketplace.visualstudio.com/ items? itemName = VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects) y crea un MSI / EXE para completar el registro por ti.

Hay muchos tutoriales sobre cómo crear un asistente de instalación usando esta extensión, por defecto VS establecerá propiedades en sus archivos dll para registrarlos durante el proceso de instalación

1
Webbarr 2 abr. 2019 a las 09:57

Después de conducir a través de algunas cosas de C # (no hay mucho VB.net sobre este tema) encontré una respuesta, necesito prefijar mi declaración de clase con este <ClassInterface(ClassInterfaceType.AutoDual)> así que:

Namespace wtf
    <ClassInterface(ClassInterfaceType.AutoDual)> Public Class samplerJam
        Public jjj As String
''' etc
1
jamheadart 17 jun. 2017 a las 00:51