2011-11-19 11 views
5

Domanda breve: è possibile (su un sistema x64 ovviamente)? Se no, perché esattamente?Chiamare un assembly x64 tramite COM da un'applicazione a 32 bit

ho sviluppato un plug-in C# dll per Excel 32.

Quando compilato in x86 funziona benissimo.

Quando è compilato in x64, la chiamata COM non riesce.

Ho bisogno di una versione a 64 bit di Excel?

Pensavo che COM fosse agnostico della compilazione dell'architettura e rendesse possibile la comunicazione tra DLL sviluppate in tecnologie diverse e con architetture diverse, ma suppongo che quest'ultimo sia sbagliato.

Immagino che una DLL x64 bit non possa ovviamente essere chiamata tramite COM (o altro) da un'app a 32 bit.

+0

Probabilmente è necessario un sistema a 64 bit (almeno un kernel) per eseguire codice a 64 bit. –

+0

@BasileStarynkevitch Sì, certo. Ho aggiunto la precisione nel post –

+0

Hai già provato la compilazione per AnyCPU? – Filburt

risposta

9

COM supporta due tipi di server, in-process e out-of-process. Le estensioni di Office sono componenti in-process, una DLL che viene caricata nel processo. Una regola complessa per i processi a 32 bit è che non possono caricare DLL a 64 bit. E viceversa. Questo viene applicato dal registro stesso, un processo a 32 bit non può accedere direttamente alle informazioni di registrazione per i server COM a 64 bit. Vengono reindirizzati alle chiavi HKLM/Software/Wow6432Node. O in altre parole, non possono nemmeno vedere i componenti del testimone sbagliato.

I componenti fuori processo non hanno questa restrizione, vengono eseguiti nel proprio processo. COM effettua il marshalling delle chiamate tra i due processi utilizzando RPC e documenti sulla differenza di controllo. Questo è anche un modo per far funzionare un server a 64 bit in-process con un host a 32 bit, è possibile eseguire il componente in un processo surrogato. Questo è difficile da ottenere e quasi mai vale la pena, le chiamate fuori processo sono molto più più chiamate in-process a causa del marshalling e del cambio di contesto richiesti. Non solo un po 'più costoso, è circa 10.000 volte più lento, soprattutto perché una chiamata di funzione in-process è molto veloce. Viene sempre e solo usato per mantenere un server legacy a 32 bit che funziona con un programma a 64 bit. Guarda COM + hosting se vuoi provarlo, non ne so molto.

+0

Grazie mille amico. Questo è esattamente il tipo di conferma pulita che stavo cercando. E la tua precisione riguardo le chiamate fuori processo che sono molto più costose è molto preziosa per noi, ci risparmia il tempo di provare a farlo con risultati di prestazioni terribili. Quindi, se davvero voglio attenermi al mio x64 Framework, credo che sia necessaria una distribuzione x64 di Excel. –