Un simple C # DLL-Comment puis-je l'appeler à partir D'Excel, Access, VBA, VB6?

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

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

Ma question Est Comment puis-je appeler cette fonction HelloWorld de Microsoft Office Visual Basic (que je pense être VB6)?

Ma première étape consistait à ajouter la DLL en tant que référence - mais lors de la navigation et de la sélection de la DLL compilée, le message "Impossible d'ajouter une référence au fichier spécifié."a été levée.

Quelqu'un peut-il me diriger dans la bonne direction pour savoir pourquoi/comment faire fonctionner cela?

Merci D'avance donc!

33
demandé sur divinci 2009-07-23 14:08:12

4 réponses

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 construction des propriétés du projet, sélectionnez Enregistrer pour COM interop. 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 la liaison précoce:

Dim o As TestDll.Test
Set o = New TestDll.Text
MsgBox o.HelloWorld
48
répondu AnthonyWJones 2015-02-02 09:52:56

Et pour développer l'enregistrement de la 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 construction des propriétés du projet, sélectionnez Enregistrer pour COM interop.

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

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

En définissant le 'Registre pour COM interop' ci-dessus -- ainsi qu'un *.fichier tlb, l'assemblée(dll) est inscrit sur votre machine, et est donc accessible.

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

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

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

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

Cependant-si vous voulez ensuite utiliser votre dll sur une machine cliente différente, vous devrez utiliser regasm.exe - pour enregistrer l'assemblée(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

Espérons que cela aide!

19
répondu divinci 2009-07-23 11:46:50

Je voulais juste commenter cela dans Visual Studio 2008, pour obtenir le .fichier tlb généré vous devez également aller sous les informations D'Application / assemblage et sélectionner "rendre L'assemblage visible". J'ai mis du temps à le découvrir, alors j'espère que ça aide les autres.

6
répondu Jage 2010-12-23 13:51:41

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

0
répondu Matthew Dresser 2009-07-23 10:33:28