Frage

Ein Workaround für den Aufruf von regasm ohne die Admin-Rechte wurde hier bereits beschrieben:

COM-Interop ohne Regasm

Ich versuche, eine COM-Bibliothek zu erstellen, die meine Benutzer ohne Administratorrechte in Excel VBA bereitstellen und verwenden können.Mir hat die Regasm-Problemumgehung gefallen, da es den Anschein hat, dass die Leute mit der Verwendung registrierungsfreier COM-Objekte aus Excel VBA nicht viel Erfolg haben.Ich möchte auch eine frühzeitige Bindung, damit meine Benutzer von der Syntaxvervollständigung profitieren können.

Die akzeptierte Antwort in der oben genannten Frage beschreibt jedoch nicht, wo die Assembly-DLL auf dem Computer des Benutzers abgelegt werden soll.Administratorrechte sind erforderlich, um die Assembly im GAC zu installieren, daher frage ich mich, wo man die DLL-Datei ablegen kann.Ich gehe davon aus, dass das Anwendungsverzeichnis nach referenzierten DLLs durchsucht wird, aber ich kann meine DLL ohne die Administratorrechte nicht erneut in das Excel-Verzeichnis einfügen.Ist es möglich, die Problemumgehung mit dem Excel-Client zu verwenden?Gibt es eine andere Möglichkeit, COM-Objekte von VBA aus aufzurufen, ohne dass die Administratorrechte erforderlich sind, um sie zuerst bereitzustellen?

War es hilfreich?

Lösung

Aufruf von regasm ohne Administratorrechte für COM-Interop

Ich denke, es sollte möglich sein zu benutzen RegistrationServices.RegisterAssembly und RegOverridePredefKey APIs zusammen, um die automatische Registrierung unter der zu implementieren HKCU hive auf UAC-freundliche Weise.Ich habe eine ausführlichere Antwort gepostet hier.

Andere Tipps

Ja, jetzt hast du zwei Probleme, du kannst es nirgendwo hinstellen sollen sagen Sie es, wie der GAC oder ein c:\program unterverzeichnis Dateien.Da diese Standorte auch eine UAC-Erhöhung erfordern.Sie haben wahrscheinlich auch vergessen, Regasm auszuführen.exe mit der Option / codebase, die erforderlich ist, um der CLR mitzuteilen, wo nach der Datei gesucht werden soll.

Der Benutzer muss über ausreichende Berechtigungen verfügen, um die DLL in ein Verzeichnis zu kopieren, auf das er Schreibzugriff hat.Das ist normalerweise nur ein Verzeichnis in c:\users\username , wie das Unterverzeichnis appdata.Die Kopfschmerzen, mit denen Sie sich befassen müssen, sind die .die Registrierungsdatei muss für jeden einzelnen Benutzer angepasst werden, da sein Benutzername unterschiedlich ist.Also das CodeBase wert in der .die Registrierungsdatei muss für jeden Benutzer geändert werden.Das skaliert schlecht, um es milde auszudrücken.

Die Antwort, die Sie gefunden haben, ist einfach keine sehr gute.Die einzige Lösung, die wirklich works besteht darin, eine eigene Registrierungsfunktion zu schreiben.Eine, die die Registrierungsschlüssel in HKCU anstelle von HKLM schreibt.Verwenden Sie die [ComRegisterFunction] Attribut.Sie wissen von der .registriere die Datei, welche Schlüssel du schreiben musst.Und Sie verwenden Assembly.GetExecutingAssembly() ausführen.Speicherort, um herauszufinden, was für den Codebasis-Registrierungswert geschrieben werden soll.Vergessen Sie nicht die Funktion [Comunregister].

Denken Sie daran, dass Sie zumindest im Geiste versuchen, die Einschränkungen zu umgehen, die der LAN-Administrator diesen Benutzern auferlegt hat.Es ist ihnen sehr wichtig zu wissen, welche Art von Code auf den von ihnen unterstützten Computern ausgeführt wird.Das könnte dich in Schwierigkeiten bringen, rede wenigstens mit dem Typen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top