2009-05-11 10 views
2

Ich versuche, einen Wrapper um ein Legacy-COM-Objekt zu schreiben und den Wrapper in den GAC zu installieren. Das Ziel wäre, die Einrichtung bestimmter Konfigurationsinformationen zu automatisieren, die die Komponente benötigt, und eine gemeinsame, stark typisierte Schnittstelle für alle meine Anwendungen zu erstellen.COM-DLL-Pfad von Com Interop Assembly suchen

Meine bisherige Lösung besteht darin, eine XML-Konfigurationsdatei im selben Verzeichnis wie die ursprüngliche COM-DLL zu speichern und die Konfiguration im Klassenkonstruktor zu laden. Leider konnte ich den Speicherort der registrierten COM-DLL nicht finden ...

Wie bekomme ich den vollständigen Dateipfad der COM-DLL, auf die von einem COM-Objekt interop dll verwiesen wird?

Antwort

2

Sobald Sie ein Objekt vom entsprechenden COM-Server erstellt haben, muss seine DLL geladen worden sein. Unter der Annahme, dass der zugrunde liegende COM-Server in "mycomserver.dll" implementiert ist, können Sie P/Invoke verwenden und GetModuleHandle ("mycomserver.dll") aufrufen - das gibt Ihnen den Pfad der DLL.

+0

Angenommen, der COM-Server ist in einer DLL implementiert und wurde in-proc ... –

2

Vermutlich konnten Sie die GuidAttribute oder CoClassAttribute Werte von der Interop-DLL abrufen, die den CLSID- und IID-Werten Ihrer COM-DLL zugeordnet werden. Dann können Sie den entsprechenden DLL-Pfad in der Registrierung nachschlagen.

+2

reg Pfad: HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID \ {GUID-hier-xxxx-xxxxxxxx} – Cheeso

+0

Ich denke, das wird für (MSI) nicht funktioniert advertiesed Komponenten - es ist also eine ziemlich spröde Lösung. –

+0

Ich bin nicht sicher, dass es deswegen spröde ist - den Weg von etwas zu finden, das noch nicht installiert ist, ist in jedem Szenario innerhalb von .NET sehr schwierig. –

1

Wenn Sie die CLSID des COM-DLL kennen, können Sie überprüfen, ob es mit dem CLSID ein Schlüssel ist auf HKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component} oder HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component} (Wow6432Node => 32-Bit-COM auf einer Maschine 64-Bit registriert)

Wenn die Schlüssel ist da, dh die COM-Komponente ist registriert. Dann schaue auf den Standardwert innerhalb des Unterschlüssels InprocServer32

z.B.

  • HKEY_CLASSES_ROOT\CLSID\{12345678-9012-3456-7890-123456789012}\InprocServer32
  • HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{12345678-9012-3456-7890-123456789012}\InprocServer32

Wenn hilft, hier ist ein Referenzbeispiel dafür, wie diese Schlüssel zu öffnen C# (Sie würden nur für den Wert in InprocServer32 überprüfen müssen): How to check COM dll is registered or not with C#?

-1

Reflektieren Sie einfach die AddIn Klasse.

var t = typeof(ThisAddIn); 
var path = t.Assembly.CodeBase; 
Verwandte Themen