Exposer pour COM Interop dll
Je pensais que je savais comment faire, mais évidemment pas si j'apprécierais un peu d'aide!
Je ne peux pas obtenir ma dll pour vous inscrire afin que je puisse instancier dans un VBS, ou ailleurs.
J'ai écrit l'exemple suivant de classe, coché la case "Faire de l'assemblée COM Visibles", coché la case "s'Inscrire pour COM Interop", puis l'a construit.
Lorsque j'essaie d'instancier à partir de VBS-je obtenir le "composant Activex ne peut pas créer l'objet" d'erreur.
C'est le code de classe:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Smurf
{
public class Pants
{
public string Explode(bool Loud)
{
string result;
if (Loud)
result = "BANG";
else
result = "pop";
return result;
}
}
}
...et c'est le VBS:
Dim a
Set a = CreateObject("Smurf.Pants")
msgbox("ok")
De quoi dois-je faire?
Merci 🙂
[modifier]
Oublié de mentionner, après le premier échec, j'ai essayé REGSVR32 et REGASM - aucune aide!
[/edit]
Remarque que lorsque je tente REGSVR32, j'obtiens ce message:
Le Module "C:...\Smurf.dll" a été chargé mais le point d'entrée DllRegisterServer est introuvable.
Assurez-vous que "C:...\Smurf.dll" est un fichier DLL ou OCX valide, puis essayez de nouveau.
Comment utile est qui??
C'est la dernière version du code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace Smurf
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface IPants
{
[DispId(1)]
string Explode(bool Loud);
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IPantsEvents
{
string Explode(bool Loud);
}
[ComVisible(true)]
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IPantsEvents))]
public class Pants : IPants
{
public Pants() { }
[ComVisible(true)]
[ComRegisterFunction()]
public static void DllRegisterServer(string key) { }
[ComVisible(true)]
[ComUnregisterFunction()]
public static void DllUnregisterServer(string key) { }
[ComVisible(true)]
public string Explode(bool Loud)
{
string result;
if (Loud)
result = "BANG";
else
result = "pop";
return result;
}
}
}
Vous avez également besoin d'
ComVisibleAttribute
sur votre Pants
type ou de l'ensemble de l'assemblée.Oh en fait, vous n'avez pas besoin
ComVisibleAttribute
.double possible de 64 bits trucs pour le développement C#
Nous faire cela, nous devons utiliser regasm solo et plus de 3 fois en place à l'aide des paramètres: tlb, le code et le regfile, puis assurez-vous que votre Vb6 code fait référence à la
*.tlb
fichier que vous créez avec le tlb
optionOriginalL'auteur CompanyDroneFromSector7G | 2012-07-19
Vous devez vous connecter pour publier un commentaire.
Il pourrait y avoir quelques choses différentes en jeu ici. Tout d'abord, vous aurez envie d'utiliser l'outil regasm avec le /base /tlb switch à partir d'une invite de commande élevée (en supposant que Windows Vista, 7 ou Windows Server 2008). Quelque chose comme:
Une fois que vous avez enregistré la dll à l'aide de regasm vous devrait être en mesure d'appeler à l'aide VBS, VBA ou VB6.
J'ai été en mesure d'utiliser la liaison anticipée et liaison tardive à partir de VBA pour appeler la
Explode
méthode. Cependant, quand j'ai essayé à partir de VBScript, j'ai reçu le "ActiveX ne peut pas créer un objet d'erreur comme vous l'avez fait."Je suis sur Windows 7 64 bits, et j'ai rappelé que cela peut causer des problèmes lors de la compilation de 32 bits dll et de les exécuter sur les systèmes d'exploitation 64 bits. Sur un coup de tête, j'ai tiré une invite de commandes et saisies:
Le résultat a été que le script s'est exécuté correctement et affiche "Pop" à l'écran.
Voici la peu simplifié le code C#, j'ai utilisé ainsi que le contenu du fichier VBScript.
VBScript:
OriginalL'auteur Tim Lentine