Aktualisiert mit mehr Informationen zur Fehlersuche
Ich verwende ein proprietäres Softwarepaket, für das ich keinen Quellcode habe, und es hat eine Plugin-Schnittstelle, die COM-basiert ist. Ich habe eine .NET-Assembly, die COM-sichtbar ist, die die Anwendung erfolgreich auf einem Computer lädt, aber nicht auf einem anderen.
Ich arbeite seit zwei Tagen an diesem Problem und habe das Gefühl, dass ich ziellos in der COM-Landschaft umherirre. Auf dem System, das mein Plugin nicht lädt, wenn ich regasm /codebase /tlb
wird die tlb generiert und erfolgreich registriert.
Wenn ich mir die einzige mir zur Verfügung stehende Protokolldatei ansehe, wird erwähnt, dass das Objekt nicht erstellt werden kann, und es wird der Fehlercode 0x80040154 zurückgegeben.
Ich kann nicht herausfinden, warum das Objekt nicht erstellt werden kann, und ich hoffe, dass jemand einige Debugging-Strategien vorschlagen kann. Hier ist, was ich bereits versucht habe, ohne Erfolg:
- meine DLL und ihre Abhängigkeiten vom Arbeitscomputer auf den Nicht-Arbeitscomputer kopieren
- Installation von VS2010 auf dem nicht funktionierenden Computer (auf dem funktionierenden Computer war es bereits installiert)
- Vergleich der Ergebnisse von Dependency Walker für meine DLL und ihre Abhängigkeiten auf beiden Computern (sie waren identisch)
- ListDLLs verwendet. Beide Systeme laden die gleichen DLLs
- Process Monitor ausgeführt und nach der CLSID für die Baugruppe gefiltert, während sie ausgeführt wird
regasm /codebase /tlb
. Beide Protokolle wurden identisch mit Ausnahme der PIDs und Datumsstempel, obwohl das funktionierende System die tlb erstellt und erfolgreich registriert hat und das nicht funktionierende System die Baugruppe registriert, aber die tlb nicht erstellt hat. - führte Process Monitor aus und filterte nach der CLSID für die Assembly, während die Anwendung ausgeführt wurde. Das funktionierende System hatte mehrere Einträge im Protokoll, aber das nicht funktionierende System hatte keine, was meiner Meinung nach zu erwarten ist, da die tlb nicht erstellt wurde.
- Ich habe mir OleView auf dem Arbeitssystem angesehen, wo die Baugruppe mit der darunter liegenden Typelibrary aufgelistet war. Auf dem nicht funktionierenden System war die Baugruppe aufgelistet, aber es gab keine zugehörige Typbibliothek. Siehe unten.
Hier sind die Unterschiede zwischen dem Eintrag der Baugruppe in OleView auf dem funktionierenden und dem nicht funktionierenden System:
- Das Arbeitssystem hat einen Eintrag unter der Assembly, von dem ich annehme, dass er der Typelibrary entspricht, die generiert und registriert wurde. Das nicht funktionierende System hat keinen.
- Objekt auf einem nicht funktionierenden System hat einen zusätzlichen Wert unter CLSID namens
InprocServer32[InprocServer32] = (gibberish here)
. - IConnectionPointContainer auf einem nicht funktionierenden System hat die gleiche
InprocServer32
Eintrag wie oben - dasselbe für IDispatch, IManagedObject und IProvideClassInfo
Ich werde die Registrierung durchsuchen, und vielleicht muss ich diese zusätzlichen Einträge entfernen und versuchen, regasm erneut zu starten?
EDIT - Ich habe das Problem gelöst. Vielen Dank an alle für eure Hilfe. Es stellte sich heraus, dass auf beiden Systemen eine Datei fehlte, aber aus welchem Grund auch immer, funktionierte regasm auf dem einen System, aber nicht auf dem anderen. Ich habe den Verdacht, dass es eine Änderung gegeben haben könnte, bei der eine Abhängigkeit in einen Ordner kopiert wurde, der im Systempfad lag! Also habe ich die dll kopiert, und regasm wurde ohne Meldungen ausgeführt. Und dann lud die Anwendung das Plugin erfolgreich!