Aussetzen dll für COM-Interop
Ich dachte, ich wüsste, wie dies zu tun, aber natürlich nicht so, ich würde schätzen etwas Hilfe!
Ich kann nicht an meine dll zu registrieren, so kann ich instanziiere es in einer VBS-oder anderswo.
Schrieb ich die folgende Beispielklasse geprüft "Make assembly COM-Sichtbar", markiert "für COM-Interop Registrieren", dann wird es gebaut.
Wenn ich versuche zum instanziieren von VBS bekomme ich die "Activex-Komponente kann Objekt nicht erstellen" - Fehler.
Dies ist der class-code:
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;
}
}
}
...und dies ist die VBS:
Dim a
Set a = CreateObject("Smurf.Pants")
msgbox("ok")
Was muss ich sonst noch tun?
Dank 🙂
[Bearbeiten]
Vergessen zu erwähnen, nach dem ersten Ausfall habe ich versucht "REGSVR32" und REGASM - keine Hilfe!
[/edit]
Beachten Sie, dass, wenn ich versuche, REGSVR32, bekomme ich diese Meldung:
Das Modul "C:...\Smurf.dll" wurde geladen, aber der Eintrag-Punkt DllRegisterServer wurde nicht gefunden.
Stellen Sie sicher, dass "C:...\Smurf.dll" ist eine gültige DLL oder OCX-Datei und versuchen Sie es dann erneut.
Wie hilfreich ist das??
Dies ist die neueste version des Codes:
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;
}
}
}
- Vielleicht kann das helfen: codeproject.com/Articles/24089/...
- Sie müssen auch
ComVisibleAttribute
auf IhremPants
Typ oder die ganze Versammlung. - Ach eigentlich brauchen Sie nicht
ComVisibleAttribute
. - mögliche Duplikate von 64 bit Sachen für den C# - Entwicklung
- Ich bin zwingen einen 32-bit kompilieren, und keine Freude. Bitte siehe update oben.
- Wir tun dies auch, dann brauchen wir regasm solo und 3 weitere Male mit unterschiedlichem Parameter: tlb, codebase und mit dem regfile, und dann stellen Sie sicher, dass Ihre Vb6-code, der auf der
*.tlb
Datei, die Sie erstellen mit dertlb
option
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es ein paar verschiedene Dinge hier im Spiel. Zunächst werden Sie wollen, verwenden Sie das regasm-tool mit der Option /codebase /tlb wechseln Sie von einer Eingabeaufforderung mit erhöhten rechten (vorausgesetzt, der Windows Vista, 7 oder Windows Server 2008). So etwas wie:
Sobald Sie registriert die dll mit regasm Sie sollte in der Lage sein, um es aufzurufen mit VBS, VBA oder VB6.
War ich in der Lage, verwenden Sie frühe Bindung und späte Bindung von VBA aufrufen, die
Explode
Methode. Jedoch, als ich versuchte von VBScript erhielt ich die "ActiveX-Objekt kann nicht erstellt Fehlermeldung wie du."Ich bin unter Windows 7 64 bit, und ich erinnerte mich, dass dies kann Probleme beim kompilieren von 32-bit-dlls und läuft auf 64-bit-Betriebssysteme. Aus einer Laune heraus, feuerte ich eine Eingabeaufforderung eingegeben:
Das Ergebnis war, dass das Skript ausgeführt und korrekt angezeigt wird "Pop" auf dem Bildschirm.
Hier ist die etwas vereinfachter C# - code, den ich verwendet, als auch die Inhalte von VBScript-Datei.
VBScript: