2010-03-04 19 views
5

utilizziamo una DLL C++ a 32 bit autoprodotta dalle nostre applicazioni C#. Ora abbiamo notato che quando le applicazioni C# vengono eseguite su un sistema a 64 bit, il runtime a 64 bit viene automaticamente utilizzato e, naturalmente, non è possibile accedere alla DLL a 32 bit dal runtime a 64 bit.C#: accesso a DLL a 32 bit/64 bit in base alla piattaforma

La mia domanda è: c'è un modo di utilizzare la DLL a 32 bit? In caso contrario, se avessi creato una versione a 64 bit della DLL, sarebbe stato possibile consentire all'applicazione di scegliere a quale P/Invoke corrispondere?

Sto pensando di creare due classi helper in C#: una che importa le funzioni dalla DLL a 32 bit e quella che importa dalla DLL a 64 bit, quindi creando una classe wrapper con una funzione per ciascuna funzione importata che chiama sia Importatore a 32 bit o importatore a 64 bit a seconda della "bittyness" del sistema operativo. Funzionerebbe?

Oppure c'è un altro modo semplice per fare le cose?

risposta

6

È necessario assicurarsi che si stiano utilizzando solo chiamate P/Invoke contro una DLL a 64 bit durante la compilazione in 64 bit.

Un'opzione è spostare tutti i "metodi" in un'interfaccia standard (o classe di base astratta) e fornire 2 implementazioni, una a 32 bit e una a 64 bit. È possibile avere un metodo factory per costruire l'istanza appropriata della classe in base alla dimensione di IntPtr.

Ciò consente a un'applicazione "AnyCPU" di correttamente, in fase di esecuzione, di determinare quale DLL inserire P/Invoke e funziona.

+0

Ho contrassegnato questa risposta la soluzione accettata ora, poiché è quello che ho fatto con successo da quando ha fatto la domanda. –

1

Puoi bandiera l'applicazione .Net per unico obiettivo l'architettura x86

+0

Sì, questo funziona, ci abbiamo provato, ma ovviamente voglio che l'applicazione funzioni in modalità 64 bit su sistemi a 64 bit. –

+0

Se si desidera che venga eseguito in modalità 64 bit, è necessario che tutte le librerie che importa siano anche a 64 bit: è quindi possibile avvolgerle in una classe statica e gestire la logica relativa alla chiamata in fase di esecuzione –

+0

Quindi in pratica stai dicendo che quello che ho suggerito nella mia domanda è la strada da percorrere? –

1

ho avuto problema simile, ma è stato con Unrar.dll essere o 32 o 64 bit.

Non ci possono essere due approcci per farlo funzionare:

una)

#if x64 
// ... define all x64 imports here 
#else 
// ... define all x86 imports here 
#endif 

e compilare domanda di 32bit e 64bit.

b) Un altro modo era creare un'interfaccia per le importazioni e implementare versioni a 32 bit e 64 bit separatamente.

Se 32 bit, istanzia l'implementazione a 32 bit, altrimenti istanzia l'implementazione a 64 bit.

+0

Sì, potremmo farlo, ma ovviamente sarebbe più bello non dover pensare di compilare per entrambe le piattaforme tutto il tempo ... –

3

Creare una classe di supporto che avvolge DLL a 64 bit e 32 bit e utilizzare IntPtr.Size per determinare quale chiamare.

if (IntPtr.Size == 8) 
{ 
    Helper.SomeMethod64(); 
} 
else 
{ 
    Helper.SomeMethod32(); 
} 
Problemi correlati