web-dev-qa-db-fra.com

Un simple C # DLL - comment l'appeler depuis Excel, Access, VBA, VB6?

J'ai une bibliothèque de classe simple écrite en c #.

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

Ma question est de savoir comment puis-je appeler cette fonction HelloWorld à partir de Microsoft Office Visual Basic (qui je pense est VB6)?

Ma première étape a été d'ajouter le DLL comme référence - mais en parcourant et en sélectionnant le DLL le message "Impossible d'ajouter une référence au spécifié) fichier. "a été jeté.

Quelqu'un peut-il m'indiquer dans la bonne direction pourquoi/comment faire en sorte que cela fonctionne?

Merci d'avance donc!

38
divinci

Vous ne pouvez pas accéder à un membre statique via COM interop. En fait, votre code ne compile même pas, la méthode devrait être dans une classe. Voici comment vous pouvez le faire:

[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! "; } }
}

Dans l'onglet Générer les propriétés du projet, sélectionnez S'inscrire à l'interopérabilité COM. Ainsi, vous pouvez voir les résultats rapidement. Pour installer la DLL sur une autre machine, vous devez utiliser regasm.

Pour ensuite consommer ceci:

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

Vous pouvez également référencer la DLL et utiliser une liaison anticipée:

Dim o As TestDll.Test
Set o = New TestDll.Text
MsgBox o.HelloWorld
54
AnthonyWJones

Et pour développer l'enregistrement du DLL sur différents ordinateurs.

Une fois que vous avez compilé et construit le code ci-dessus sur votre machine de développement, si vous avez

Dans l'onglet Générer les propriétés du projet, sélectionnez S'inscrire à l'interopérabilité COM.

votre dossier de sortie Visual Studio (généralement bin\Debug) où se trouve le fichier * .dll compilé aura également un fichier * .tlb.

Ce fichier * .tlb est une "bibliothèque de types". Et est nécessaire à la machine cliente pour comprendre les différents "types" dans votre * .dll et pour dire à la machine cliente comment l'utiliser.

En définissant le 'Register for COM interop' ci-dessus - ainsi qu'un fichier * .tlb en cours de production, l'assembly (dll) est enregistré sur votre machine et est donc accessible.

Dans VBA, vous pouvez maintenant ajouter ce fichier comme référence en

Éditeur VBA -> Outils -> Références -> Parcourir -> Sélectionner

cela vous permettra ensuite de déclarer les classes trouvées dans votre bibliothèque.

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

TOUTEFOIS - si vous souhaitez ensuite utiliser votre DLL sur une autre machine cliente, vous devrez utiliser regasm.exe - pour enregistrer l'assembly (DLL) sur cette machine.

Cela peut être fait par la ligne de commande,

regasm.exe

dans ce cas

regasm.exe TestDll.dll

une fois que vous avez enregistré l'assembly sur la nouvelle machine cliente, vous pourrez y accéder en ajoutant à nouveau une référence à son * .tlb

J'espère que cela t'aides!

22
divinci

Je voulais juste dire que dans Visual Studio 2008, pour obtenir le fichier .tlb généré, vous devez également aller sous Application | Informations sur l'assemblage et sélectionnez "Rendre l'assemblage COM visible". Cela m'a pris un certain temps pour trouver cela, alors j'espère que cela aide les autres.

10
Jage

Pour ajouter à la bonne réponse d'AnthonyWJones, vous devrez également enregistrer votre DLL à l'aide de Regasm.exe qui ajoute les entrées de registre nécessaires.

1
Matthew Dresser