2008-12-11 8 views
22

Ich habe einen x64-Server, der, da meine Bibliotheken zu AnyCPU kompiliert werden, unter x64 ausgeführt werden. Wir müssen auf eine COM-Komponente zugreifen, die unter x86 registriert ist. Ich weiß nicht genug über COM und meine Google-Suche führt mich nirgendwohin.Zugriff x86 COM von x64 .NET

Frage: Kann ich eine symbolische Registrierungsverknüpfung von x64 zurück zu x86 für die COM-Komponente verwenden? Muss ich die COM-Komponente auch unter x64 registrieren? Kann ich (irgendeine Aussage hier ...)?

Danke.

Antwort

26

Wenn eine Komponente x64-nativ ausgeführt wird, kann sie keinen 32-Bit-COM-Server prozessintern laden, da dies die falsche Art von Prozess ist. Es gibt ein paar Lösungen möglich:

  1. Wenn Sie können, bauen eine 64-Bit-Version des COM-Code (die sich natürlich registrieren würde in der 64-Bit-Registrierung). Dies ist die sauberste Lösung, aber möglicherweise nicht möglich, wenn Sie den Code für den COM-Server nicht haben.

  2. Führen Sie Ihre .NET-Komponente als 32-Bit x86 anstelle von x64. Ich nehme an, Sie haben diesen aus irgendeinem Grund bereits erwogen und abgelehnt.

  3. Host die COM-Komponente out-of-Prozess mit der COM surrogate DLLhost.exe. Dadurch werden Aufrufe an den COM-Server sehr viel langsamer (sie sind jetzt Interprozess-Windows-Nachrichten anstelle von systemeigenen Funktionsaufrufen), aber ansonsten transparent (Sie müssen nichts Besonderes tun).

    Dies ist wahrscheinlich keine Option, wenn der Server einen benutzerdefinierten Proxy-Stub erfordert, anstatt den normalen oleaut32 zu verwenden (sehr selten), da keine 64-Bit-Version des Proxys verfügbar sein wird . Solange es das gewöhnliche OLE-Marshalling verwenden kann, können Sie einfach register it for surrogate activation.

+0

# 1 ist nicht möglich, da es keine x64-Version gibt. # 2 besiegt den Zweck, auf x64 zu laufen. # 3 hat super funktioniert. Wir können mit den Performance-Hits leben, bis wir eine neue Version der Bibliothek bekommen. Danke für Ihre Hilfe. –

2

Es ist Ihre COM-Komponente in einem COM-Server (dh ein eigener Prozess) untergebracht ist, dann brauchen Sie nichts besondere, da das COM-Subsystem wird Remote-Anrufe von Ihrem x64 App auf das X86-App zu tun und wieder zurück.

Wenn Ihre Komponente eine in Bearbeitung befindliche COM-Komponente ist, müssen Sie die Dinge überdenken, da ein 64-Bit-Prozess keine 32-Bit-COM-Komponenten im Prozess verwenden kann. Sie könnten Ihren Server zwingen, unter x86 zu laufen, damit Sie auf die Komponenten zugreifen können (sie sind beide 32-Bit-Prozesse). Wenn Sie das nicht möchten, müssen Sie sehen, ob es eine x64-Bit-Version der von Ihnen verwendeten COM-Komponenten gibt.

6

ich diese Lösung gefunden haben, finden Sie Dealing with Legacy 32-bit Components in 64-bit Windows in Artikel:
• einen Projekttyp Konvertieren von in-Prozess zu Out-of-Process-
• Verwenden von COM + als Host (diese Arbeit für mich)
• Verwenden dllhost als Ersatz-Host

+7

Mirror-Link: http://www.scribd.com/doc/56629579/64-Bit-Insider-Volume-1-Issue-7 – Juhl

Verwandte Themen