2009-07-23 45 views
33

Tengo una biblioteca de clase simple escrita en C#.Una simple C# DLL: ¿cómo la llamo desde Excel, Access, VBA, VB6?

using System; 
namespace TestDll 
{ 
    public class Test 
    { 
     public string HelloWorld 
     { 
      get 
      { 
       return "Hello World"; 
      } 
     } 
    } 
} 

Mi pregunta es ¿cómo puedo llamar a esta función HelloWorld desde Microsoft Office Visual Basic (que creo que es VB6)?

Mi primer paso fue agregar el archivo DLL como referencia, pero al explorar y seleccionar el archivo DLL compilado, aparece el mensaje "No se puede agregar una referencia al archivo especificado". fue lanzado.

¿Alguien puede dirigirme en la dirección correcta de por qué/cómo hacerlo funcionar?

Gracias de antemano SO!

+0

Intercambio de la etiqueta dllimport para la etiqueta de interopera ... – Ant

Respuesta

47

No puede acceder a un miembro estático a través de la interoperabilidad COM. De hecho, su código ni siquiera compila, el método debe estar en una clase. Aquí se muestra cómo puede hacerlo:

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")] //Allocate your own GUID 
public interface _Test 
{ 
    string HelloWorld { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("E2F07CD4-CE73-4102-B35D-119362624C47")] //Allocate your own GUID 
[ProgId("TestDll.Test")] 
public class Test : _Test 
{ 
    public string HelloWorld { get { return "Hello, World! "; } } 
} 

La ficha Generar de las propiedades del proyecto, seleccione Registrar para interoperabilidad COM. Para que pueda ver los resultados rápidamente. Para instalar el dll en otra máquina necesita usar regasm.

A continuación, el consumo de este:

Dim o : Set o = CreateObject("TestDll.Test") 
MsgBox o.HelloWorld 

También puede hacer referencia a la DLL y utilizar enlace:

Dim o As TestDll.Test 
Set o = New TestDll.Text 
MsgBox o.HelloWorld 
+0

gracias AnthonyWJones, una muy buena respuesta. He estado buscando desde que publique esta respuesta. ¡Descubrí todo excepto que tenía que declarar una interfaz! ¡¡Muchas gracias!! – divinci

+0

Se puede hacer sin declarar una interfaz pero no lo recomendaría, usar una interfaz específicamente para ser consumida por un cliente COM es una forma mucho mejor de hacerlo. – AnthonyWJones

+0

Gracias Anthony, ¿te importa criticar la respuesta de seguimiento que publiqué? – divinci

0

Para añadir a la buena respuesta de AnthonyWJones, también debe registrar su DLL usando Regasm.exe que agrega las entradas de registro necesarias.

+0

Lo siento, no noté que AnthonyWJones ya había mencionado Regasm. –

19

Y para expandir el registro de la DLL en diferentes computadoras.

Una vez que compilar y construir el código anterior en el equipo de desarrollo, si tiene

Las propiedades del proyecto pestaña Crear, seleccione Registro de interoperabilidad COM.

su carpeta de salida de Visual Studio (generalmente bin \ Debug) donde se encuentra el compiled * .dll también tendrá un archivo * .tlb.

Este archivo * .tlb es una 'Biblioteca de tipos'. Y el equipo del cliente lo necesita para comprender los diferentes 'Tipos' en su * .dll y básicamente decirle al equipo del cliente cómo usarlo.

Configurando lo anterior 'Registrarse para interoperabilidad COM' - así como también se está produciendo un archivo * .tlb, el conjunto (dll) está registrado en su máquina y, por lo tanto, está accesible.

En VBA ahora se puede añadir este archivo como referencia por

VBA Editor -> Herramientas -> Referencias -> Consulta -> Seleccione

esto le permitirá a continuación, declara la clases encontradas en tu biblioteca.

Dim TestClass As Test 
Set TestClass = New Test 
MsgBox TestClass.HelloWorld 

Sin embargo - si quieres a continuación, utilizar el archivo DLL en una máquina cliente diferente, usted tendrá que usar regasm.exe - para registrar el ensamblado (DLL) en esa máquina.

Esto se puede hacer mediante la línea de comandos,

regasm.exe

en este caso

regasm.exe testdll.dll

vez ha registrado la asamblea en la nueva máquina del cliente, usted wi Podré acceder a él añadiendo una referencia a su * .tlb

Espero que esto ayude!

+0

Sí, creo que lo tienes bien cubierto – AnthonyWJones

+0

¿Ejecutas regasm en la máquina desarrolladora o en la máquina cliente? Porque mi máquina cliente no tiene .NET instalado. – Alexey

+0

Alexey the .Net DLL necesitará .Net framework para ejecutarse en la máquina cliente. – divinci

6

Solo quería comentar que en Visual Studio 2008, para obtener el archivo .tlb generado también debe ir debajo de la Aplicación | Información de ensamblaje y seleccione "Hacer visible el ensamblado COM". Me tomó un tiempo encontrar eso, así que espero que ayude a otros.

+1

+1 gracias, gracias, gracias! Trabajó muy intermitentemente antes, luego se detuvo, ahora trabaja después de hacer esto, Dios sabe qué pasará después, pero al menos funciona por ahora. Usando VS2010 aquí, sigue siendo relevante. –

Cuestiones relacionadas