Die Registrierung .Net COM-DLLs ohne Admin-Rechte / regasm
Kürzlich schrieb ich eine Klassenbibliothek in C# für die Verwendung in Office-Anwendungen, einschließlich einer kritischen Access-Anwendung, die verwendet ~70 Leute. Für Benutzer mit admin-Rechte, die DLL registrieren, ist trivial, aber immer die DLL die Arbeit an anderen Maschinen war problematisch.
Registrierung der DLL für die Verwendung mit admin-rechten
- Erstellen Sie die DLL, die in Visual Studio. Sicherzustellen, dass diese Optionen ausgewählt sind, auf das Projekt Anwendung tab:
- Ausgang Typ: Klasse Bibliothek
- Montage Informationen: Make assembly COM-sichtbar: Geprüft
- Verwenden Sie eine erhöhte Eingabeaufforderung zu registrieren Sie die assembly:
RegAsm YourDll.dll /tlb /codebase
- Fügen Sie einen Verweis auf
YourDll.tlb
in VBA: Tools-->Referenzen - Stellen Sie sicher, dass Sie erstellen eine Instanz des Objekts
Was ist passiert?
Regasm tut einige Dinge hier. Erstens, es ist die Schaffung einer Art Bibliothek (YourDLL.tlb) bietet Informationen über die Klassen, die in der DLL. Zweitens, es wird speichern die Informationen über die Bibliothek in der Registrierung so, dass das system "weiß", was Sie meinen, wenn Sie Fragen, für eine Klasse, die instanziiert werden sollen, als ein Objekt.
Um zu sehen, welche registry-Einträge Regasm wird hinzufügen, können Sie es mit der /regfile
parameter:
Regasm YourDLL.dll /codebase /regfile
(Die /regfile
option ungültig ist mit der /tlb
parameter.)
Wenn die /codebase
option weist Regasm enthalten Informationen darüber, wo YourDLL.dll
befindet sich auf der Festplatte, die ist wichtig für die Erstellung der Objekte.
Wenn Sie öffnen YourDLL.reg
in einem text-editor, sehen Sie die Einträge, die Regasm ist das hinzufügen der registry-Einträge, um HKEY_Classes_Root
(die eigentlich nur eine Umleitung zu HKLM\Software\Classes
). Leider, Sie benötigen admin-Rechte zum ändern HKLM
, so dass dies nicht zur Arbeit zu gehen, unsere anderen Nutzern.
Gibt es ein paar andere threads (z.B. Registrierung einer COM ohne Admin-Rechte, Registrieren von COM-DLL für den Einsatz von VBA, Register DLL (ActiveX) für non-admin-Benutzer, Unfähig, sich zu registrieren .NET-COM-DLL, COM-Interop-ohne regasm) dass das problem zu besprechen, aber Ihre Lösungen sind Komplex (z.B. benötigen registry-Umleitung) oder unvollständig (vorausgesetzt, Sie bereits wissen, mindestens die Hälfte der Antworten) oder nicht die Arbeit in gemischten 64/32 bit-Umgebungen (z.B. Win64, Office32).
So wie Sie sich registrieren eine COM-DLL, die in Visual Studio erstellt, für die Verwendung in VBA 32-und 64-bit-Umgebungen für den aktuellen Benutzer ohne Administratorrechte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einrichten der registry-Dateien
Registrieren der Komponenten für den Einsatz in 32-und 64-bit-Umgebungen, wir gehen zu müssen, ändern Sie die Registrierung-Datei, die wir erstellt haben in unserem test-Fall. Öffnen Sie es mit Ihrem Lieblings-text-editor. Die Einträge sollten wie folgt Aussehen:
Stellen Sie sicher, dass es
"CodeBase"=
Einträge.Tun, ein globales suchen/ersetzen:
HKEY_CLASSES_ROOT
(was ist aliasing zuHKLM\Software\Classes
)HKEY_CURRENT_USER\Software\Classes
Kopieren Sie alle Registrierungsschlüssel (und deren Werte, die unten aufgeführt sind die Schlüssel) auf eine zweite text-Datei. In der zweiten text-Datei:
\CLSID\
Classes\CLSID
Classes\Wow6432Node\CLSID
Kopieren Sie alle Schlüssel von der zweiten text-Datei zu Ihrem original .reg-Datei, und speichern Sie es.
Entfernen Sie die Registrierung Einträge aus
HKLM
mittels regasm:Stellen Sie sicher, dass die Dinge nicht funktionieren
In, um sich zu vergewissern, dass unsere Wechsel funktioniert haben, und dass Sie nicht nur erfolgreich durch die Registrierung hast du mit regasm ursprünglich), die wir brauchen, um stellen Sie sicher, dass VBA nicht erstellen Sie das Objekt jetzt.
Öffnen Sie Ihre Lieblings-VBA-Anwendung, und fügen Sie einen Verweis auf
YourDLL.tlb
. Erstellen Sie eine neue Prozedur, die so etwas wie dieses:Laufen
TestYourDLL
. Sollten Sie die Fehlermeldung erhalten:(Wenn Sie nicht die Fehlermeldung erhalten, dass deine DLL noch registriert ist.)
Speichern und beenden Sie Ihre VBA-Anwendung.
Sicherstellen, dass Sie arbeiten
Führen Sie jetzt das
YourDLL.reg
, die Sie zuvor erstellt haben, importieren Sie die Einträge in der registry. (Wenn Sie erhalten eine "Zugriff verweigert" angezeigt, haben Sie vergessen zu ändernHKEY_CLASSES_ROOT
zuHKEY_CURRENT_USER\Software\Classes
)Öffnen Sie Ihren VBA-Anwendung erneut, und führen Sie
TestYourDLL
. Sie sollten jetzt sehen, "Offenbar funktioniert hat." in das Direktfenster. Herzlichen Glückwunsch! Sie haben registriert die DLL! (Wenn Sie eine "Automation error: The system cannot find The file specified"-Typ Fehler, Ihre registry-Datei ist fehlt dieCodebase
Einträge, oder Sie sind nicht auf den tatsächlichen Speicherort Ihrer DLL.)Zusätzliche Schritte
In meinem Fall, ich werde sein, installieren Sie die DLL auf einen Haufen von anderen Computern der Benutzer zusammen mit meinem Antrag, also zum Zeitpunkt der installation, ich werde aktualisieren, die
CodeBase
Wert zu finden der Ort, wo ich bin der Installation der DLL, und ich werde auch installieren, die registry-Einträge durch code anstatt durch das ausführen des .reg-Datei. Aber, seit ich weiß, dass Sie die erforderlichen Eingaben, das zu tun ist trivial.regasm /regfile
waren dieCodeBase
Einträge, aberregasm /codebase /regfile
behoben. (Natürlich, die 32-bit-Registrierung war auch fehlt, das ist, warum ich hatte zu erstellen, die Einträge an mich, mit der grundlegende Informationen als Basis.) Waren Sie in der Lage, herauszufinden, welche Einträge fehlen für Sie?/regfile
option. Ich habe versucht, die Ernte der fehlenden etnries direkt aus der registry, aber es erwies sich als eine ziemlich mühsame Aufgabe. Ich gab schließlich auf und bat meinen Chef um die DLL zu registrieren mit seinem admin-account für mich... 🙂C Weiß, die Antwort ist toll, wenn Sie können es manuell auf jeden computer.
Für automatisches hinzufügen der erforderlichen registry-Einträge, benutze ich den folgenden code. Es Konten für 32-bit Office auf 64-bit Windows, und kann gereinigt werden, bis später.
Verwenden Sie einfach
RegisterDLL "C:\Path\To\File.DLL"
automatisch fügen Sie die erforderlichen Einträge.Aufräumen bei der deinstallation können Sie die folgenden verwenden:
Diese Skripts erfordern keine Referenzen und kein admin-Zugang. Sie sollten in der Regel schnell laufen und lassen für die Einstellung beim starten der Anwendung, sowie die Reinigung bei Herunterfahren der Anwendung, wenn Konflikte könnte ein Problem sein.