2009-07-23 5 views
33

J'ai une simple bibliothèque de classes écrite en C#.Une simple C# DLL - comment l'appeler à partir d'Excel, Access, VBA, VB6?

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 de Microsoft Office Visual Basic (qui je pense est VB6)? Ma première étape consistait à ajouter la DLL comme référence - mais en parcourant et en sélectionnant la DLL compilée le message "Impossible d'ajouter une référence au fichier spécifié." a été jeté.

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

Merci d'avance SO!

+0

Échange de l'étiquette dllimport pour l'étiquette d'interopérabilité ... – Ant

Répondre

47

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 procéder:

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

Propriétés du projet Créer l'onglet, sélectionnez Enregistrer pour COM interop. Vous pouvez donc voir les résultats rapidement. Pour installer la DLL sur une autre machine, vous devez utiliser regasm.

A consommer alors ceci:

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

Vous pouvez également faire référence à la dll et utiliser la liaison anticipée:

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

merci AnthonyWJones, une très bonne réponse - j'ai cherché depuis que j'ai posté cette réponse - a tout découvert sauf que j'ai dû déclarer une interface! Merci beaucoup!! – divinci

+0

Cela peut être fait sans déclarer une interface mais je ne le recommanderais pas, en utilisant une interface spécifiquement pour être consommée par un client COM est une bien meilleure façon de le faire. – AnthonyWJones

+0

Merci Anthony, est-ce que ça te dérange de critiquer la réponse de suivi que j'ai postée? – divinci

0

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

+0

Désolé, n'a pas remarqué que AnthonyWJones avait déjà mentionné Regasm. –

19

Et de développer sur l'inscription de la DLL sur différents ordinateurs.

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

Les propriétés du projet Construire onglet, sélectionnez Inscrivez-vous pour COM Interop. Votre dossier de sortie Visual Studio (généralement bin \ Debug) où se trouve le fichier * .dll compilé contient également un fichier * .tlb.

Ce fichier * .tlb est une 'bibliothèque de types'. Et l'ordinateur client a besoin de comprendre les différents 'Types' dans votre fichier * .dll et de dire à la machine cliente comment l'utiliser. En réglant le 'Register for COM interop' ci-dessus - ainsi qu'un fichier * .tlb en cours de production, l'ensemble (dll) est enregistré 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électionnez

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

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

CEPENDANT - si vous voulez utiliser alors votre dll sur un ordinateur client différent, vous devrez utiliser regasm.exe - pour enregistrer l'ensemble (dll) sur cette machine.

Cela peut être fait par la ligne de commande,

regasm.exe

dans ce cas

regasm.exe Testdll.dll

fois vous avez enregistré l'assembly sur la nouvelle machine client, vous wi ll sera en mesure d'y accéder en ajoutant à nouveau une référence à son * .tlb

Espérons que cela aide!

+0

Oui, je pense que vous avez bien couvert – AnthonyWJones

+0

Exécutez-vous regasm sur la machine de développement ou la machine client? Parce que mon ordinateur client n'a pas installé .NET. – Alexey

+0

Alexey la DLL .Net aura besoin de l'infrastructure .Net pour s'exécuter sur la machine client. – divinci

6

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

+1

+ 1 merci, merci, merci! Travaillé très par intermittence avant, puis arrêté, travaillant maintenant après avoir fait cela, Dieu sait ce qui se passe ensuite, mais au moins ça marche pour l'instant. En utilisant VS2010 ici, donc toujours pertinent. –

Questions connexes