2010-07-27 6 views
7

J'ai une bibliothèque de classes écrite en .Net que je voudrais mettre à la disposition de VB6/VBA. Ce que j'ai essayé n'a pas fonctionné (évidemment puisque je pose cette question). Voici ce que j'ai fait:Rendre une DLL COM accessible

  1. J'ai créé un projet de bibliothèque de classes dans Visual Studio 2010 Express et ai placé le code dans un module de classe.
  2. J'ai ouvert les propriétés du projet et suis allé à "Informations d'assemblage" et coché "Rendre COM visible".
  3. Je suis allé aux options "Advanced Compile" et ciblé .Net 2.0 (c'est un code très simple).
  4. J'ai ensuite supprimé toutes les références attendues pour "Système".
  5. J'ai construit le projet (sans avertissement ni erreur) et copier la DLL hors du dossier Bin dans C: \ Windows \ System32 \
  6. J'ai couru regsvr32 pour enregistrer la DLL et a obtenu l'erreur:

The module "MyDll.dll" was loaded but the entry-point DLLRegisterServer was not found.

Make sure that "MyDll.dll is a valid DLL or OCX file and then try again.

Il est clair que ma première tentative était un peu naïve. Quelqu'un pourrait-il offrir des conseils?

+2

regsvr32 ne peut pas être utilisé sur les assemblys .NET. Utilisez les arguments regasm et optionnels - http://msdn.microsoft.com/en-us/library/tzat5yw6%28VS.71%29.aspx –

Répondre

10

L'étape 6 est incorrecte. Les assemblys .NET avec des types [ComVisible] sont enregistrés avec Regasm.exe. Utilisez l'option de ligne de commande/codebase si vous ne souhaitez pas installer la DLL dans le GAC. L'option de ligne de commande/tlb crée la bibliothèque de types, vous pouvez l'utiliser dans votre projet VB6.

+0

J'ai fait une recherche de fichier pour regasm.exe et il semble être manquant. Est-ce seulement disponible avec la version complète de Visual Studio? Est-ce que MS offre un téléchargement (je suis encore googling, mais je pensais que vous pourriez juste savoir.) – Oorang

+2

Il devrait être dans le répertoire c: \ windows \ microsoft.net \ framework \ v4.0.30319. Vous manquez le "invite de commande Visual Studio" pour rendre cela facile. Mais cela peut être fait. –

+0

OK J'ai trouvé RegAsm et l'ai utilisé. Cela a créé une tlb que je pourrais référencer. Quand je l'ai ouvert dans VB6/VBA, toutes les propriétés et méthodes manquaient. En lisant quelques-uns des autres liens fournis, je déduis que j'ai besoin de créer une interface (ce que je n'ai pas fait, je viens de créer la classe). Je peaufine encore l'interface mais c'était une étape majeure. Je vous remercie. – Oorang

0

Je suis assez certain RegSvr32 ne fonctionne que sur DLL .NET non. Les assemblys .NET sont stockés dans le Global Assembly Cache (GAC). Vous devez exécuter le fichier gacutil.exe.

+0

Les mettre dans GAC n'est pas nécessaire. regasm avec la clé '/ codebase' sera très bien. – sharptooth

+0

@sharptooth: Merci, je ne savais pas que –

3

Vous devez définir des GUID pour vos interfaces et marquer les classes qui implémentent les interfaces à démarrer. MSDN a un getting started guide. Vous n'avez pas besoin de courir RegSvr32, mais vous avez besoin de mettre la DLL quelque part where the app can find it:

After registering an assembly using Regasm.exe, you can install it in the global assembly cache so that it can be activated from any COM client. If the assembly is only going to be activated by a single application, you can place it in that application's directory.

Il y a aussi un bon aperçu de l'ensemble du processus here.

+0

+1 Pour les liens. – Oorang

0

Utilisez GacUtil au lieu de RegSvr32. RegSvr est utilisé pour les DLL créées avec VB6 et pour les DLL .NET, vous devez utiliser GacUtil car il est ajouté au cache de l'assembly global.

Questions connexes