2009-05-17 6 views
13

Ho bisogno di integrare un codice legacy a 32 bit, per il quale non ho il codice sorgente, in un progetto in modo tale che possa essere chiamato da un assembly .NET a 64 bit. Il codice originale è implementato come un oggetto COM a 32 bit in una DLL. Windows non consente chiamate dirette da oggetti da 64 a 32 bit, quindi sono alla ricerca di ispirazione su come affrontare questa situazione.Interop da 64 a 32 bit - come?

Come si può accedere a un oggetto COM a 32 bit legacy da un assembly .NET a 64 bit?

AGGIORNAMENTO: Abbiamo scoperto che il componente COM era a sua volta un wrapper attorno ad ANSI C, su cui è stata creata l'origine originale. Siamo stati in grado di compilarlo in Visual Studio come una dll nativa a 64 bit e importarla in .NET - mi spiace spostare i goalposts!

+0

Commento, poiché non l'ho fatto, ma è necessario assicurarsi di eseguire l'oggetto COM come server out-of-process. Se lo si carica come in-process, verrà eseguito come 64-bit, che fallirà. –

risposta

8

L'approccio migliore consiste nel creare un server COM fuori processo che avvolge la DLL a 32 bit. È quindi possibile chiamare questo codice a 64 bit.

Here is an explanation dei concetti di base.

+0

Ho spostato un po 'i pali perché abbiamo scoperto un codice sorgente che ci ha portato a una soluzione diversa. Sto accettando questa risposta poiché ritengo che risponda al meglio alla domanda originale e ai collegamenti a materiale di lettura utile. –

3

Quello che devi fare è creare due processi di comunicazione con IPC. In questo modo, uno può essere a 32 bit e uno a 64 bit. È necessario creare un programma 32 che collega l'oggetto COM e espone la sua API tramite un meccanismo IPC come una named pipe. In questo modo il tuo programma .NET può accedervi da un altro processo.

+0

Questo approccio funziona, anche se si sta già utilizzando COM, perché passare a named pipe invece di utilizzare solo l'interoperabilità COM? –

+0

@Reed Copsey: Oh, sì, certo che potresti usarlo per COM. Ma il mio approccio è più generale; potrebbe funzionare anche per le normali librerie. – Zifre

+0

Ho pensato di utilizzare WCF per eseguire l'IPC utilizzando Named Pipes. Unico problema è che entrambe le estremità della pipe devono vedere la stessa definizione di interfaccia, che deve essere presente in un assembly a 32 bit. L'intera cosa esplode quando si tenta di eseguirlo. –

3

Controllare questo blog post. È possibile fare riferimento a un assembly COM a 32 bit da un'applicazione .NET a 64 bit utilizzando un wrapper Callable di runtime. La versione breve è la seguente ...

  1. Utilizzare Tlbimp.exe per creare un 64 bit Runtime Callable Wrapper:

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. registrare l'assembly COM (non il RCW) se si non hanno già:.

    regsvr32.exe foo.dll

  3. riferimento il RCW (ad esempio Interop.Foo.dll) dalla tua applicazione. Cambia la configurazione della tua build in x64 e lascia che sia rock.

+0

Questa non è una soluzione al problema originale. –