Frage

Szenario: Ich habe ein Projekt containgin zwei C # -Projekte, die aus historischen Gründen miteinander mit COM kommunizieren muss (über COM-Interop). Der COM-Server ist ein In-Process-Automatisierungsobjekt (nennt dies der „Server“) und der COM-Client eine einfache C # Konsolenanwendung ist, die den Server wie folgt geladen:

        var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
        var objLateBound = Activator.CreateInstance(objType);

Visual Studio registriert Baugruppen automatisch für COM-Interop, wenn diese Option in den Projekteinstellungen aktiviert ist, so dass das, was ich den Server registrieren verwenden (I in der Entwickler Erfahrung nur interessiert bin hier, ist die Installation eine separate Ausgabe) und alles funktioniert gut, solange die Projekte 32-Bit-Code oder der COM-Client ist 32-Bit zu erzeugen, werden eingestellt.

Das Problem kommt, wenn sie auf einem 64-Bit-System zu entwickeln und beiden Projekte gesetzt Code für ‚Any CPU‘ zu erzeugen, die in ihnen führen zu 64-Bit-Modus ausgeführt wird. Daraus ergibt sich die folgende Fehlermeldung:

"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."

Nach einigen Untersuchungen, so scheint es, dass die MSBuild Scripts nur 32-Bit-Registrierung durchführen. Es ist die ProgID in den Abschnitt 64-Bit-Register setzen, zusammen mit seinen Unterschlüssel CLSID und die richtige classID. Aber die CLSID {CLSID} Sachen gibt es nicht. Es ist nur in der WOW6432 Teilstruktur für 32-Bit. So ist der Aktivator kann die Klasse ab Werk nicht abrufen, weil es nicht das Ding finden.

Ich werde mit der SO-Community wirklich beeindruckt, wenn ich eine Antwort auf diese ein, aber hier geht:

Hat jemand sonst laufen quer durch dieses Problem? Wie haben lösen Sie es? Was ist der einfachste Weg, um sicherzustellen, dass COM-Interop-Baugruppen korrekt auf 64-Bit-Entwicklungsmaschinen registriert werden?

War es hilfreich?

Lösung

Wir haben dieses Problem erkannt und gelöst es von Projekten bis zu erzeugen Baugruppen für x86-Einstellung. Dies ist suboptimal, natürlich, aber wir haben auch mehrere native 32-Bit-Libs, also mussten wir das auf jeden Fall tun.

Andere Tipps

Ich konnte dies mit dem folgenden KB-Artikel lösen. Grundsätzlich wandte ich mich die Registrierung für COM-Interop in dem Projekt Aus-Einstellungen bauen, und verwenden, um den Post-Build-Befehl:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933

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