Ich habe ein COM-Objekt eines Drittanbieters (32 Bit), das ich von meiner c # -Anwendung (64 Bit) aus aufrufen muss. Ich weiß, dass ich das COM-Objekt in einem separaten Prozess ausführen muss. In diesem COM-Objekt sind viele Klassen implementiert, daher versuche ich, meinen eigenen Remoting-Wrapper zu schreiben, der alle Methoden verfügbar macht. COM + scheint die einfachste Lösung zu sein. Ich habe das Menü Komponentendienste geöffnet, eine neue COM + -Anwendung erstellt und mein COM-Objekt als Komponente zu dieser Anwendung hinzugefügt. Alles schien schön zu sein.
In meiner C # -Anwendung habe ich das ursprüngliche COM-Objekt als Referenz hinzugefügt (wodurch automatisch die Typbibliothek generiert wird). Mithilfe der Typbibliotheksreferenz kann ich Objekte aus der COM + -Komponente erstellen (ich sehe, dass sie im Komponentendienste-Fenster zu drehen beginnen), aber wenn ich versuche, auf eine der Methoden des Objekts zuzugreifen, erhalte ich eine Fehlermeldung über die Schnittstelle ist nicht registriert.
Hat jemand eine Ahnung? Ich ging zurück und lief regsvr32 auf dem COM-Objekt, aber ich glaube nicht, dass es notwendig war, und es hat nicht geholfen. Ist meine Verwendung in C # korrekt? VS2008 Autocomplete hatte kein Problem diese Methoden zu sehen.
Die genaue Ausnahme ist: "Schnittstelle nicht registriert (Ausnahme von HRESULT: 0x80040155)"
Unklar darüber, was genau die Berechtigungen und Rollen in den Komponentendiensten sind, habe ich versucht, die COM + -Objektidentität so einzurichten, dass sie sowohl als lokaler Dienst als auch als interaktiver Benutzer unter dem Systemkonto ausgeführt wird. Ich habe Jeder als Benutzer in den Rollen hinzugefügt. Alles läuft lokal, daher sollte es kein Problem mit Dateiprivilegien oder ähnlichem geben.
Ich möchte auch wiederholen, dass dieses COM-Objekt viele Klassen enthält. Ich habe erfolgreich ein Klassenobjekt in meinem Client instanziiert und einige Eigenschaftswerte festgelegt. Ich instanziierte auch erfolgreich ein anderes Klassenobjekt, aber erhielt diese Ausnahme, wenn ich versuchte, eine Methode dieses zweiten Objekts aufzurufen .... also denke ich nicht daran gibt es ein Problem, mit welcher Registrierung mein COM-Objekt ist eingeschrieben.
Wir hatten eine ähnliche Situation und arbeiteten mit einer COM-DLL von VFP.
Alles hängt von Rechten und Berechtigungen ab, wie Yahia sagt. Wir haben es geschafft, indem wir das tun:
und wir mussten noch einige Einstellungen für die Rechte im Anwendungspool / IIS vornehmen, aber das ist für dich nicht nötig, denke ich.
Wie auch immer, stellen Sie sicher, dass Sie genug Logging haben, stellen Sie sicher, dass die DLL registriert ist, und danach geht es um Rechte Rechte ..
Viel Glück damit!
Es tut mir leid, die "Antwort" zu verwenden, um auf Kommentare zu antworten, aber es scheint meine einzige Möglichkeit zu sein.
Der ganze Zweck des Umstiegs auf ein 64-Bit-Betriebssystem bestand darin, den zusätzlichen adressierbaren Speicherplatz zu gewinnen. Daher ist es nicht möglich, die gesamte Anwendung im 32-Bit-Modus auszuführen.
Es könnte für das Problem relevant sein, dass ich nach dem erfolgreichen Erstellen von drei Klassenobjekten in der Lage war, Eigenschaften in einem zu setzen, eine Methode ohne Argumente in der zweiten aufzurufen, aber eine Methode in der dritten aufruft andere zwei Objekte als Argumente, die die Ausnahme ausgelöst haben.