2016-01-25 24 views
5

Ho letto molte domande e risposte che indicano che se voglio collegare il mio progetto C# alle librerie native, non posso usare il target della piattaforma AnyCPU ma devo creare build separati a 32 e 64 bit, ciascuno collegato alla DLL nativa del testimone appropriato.In che modo le classi di .NET Framework fanno riferimento a DLL Windows native senza diventare specifici per i test di verifica?

Questo mi fa pensare a come gli assembly .NET Framework sono o almeno sembrano essere creati per AnyCPU. Cioè, quando si aggiunge un riferimento alla mia applicazione GUI, perché non devo scegliere la versione a 32 o 64 bit di System.Windows.Forms? Ho pensato che potesse trattarsi solo di qualche magia di Visual Studio che sarebbe stata risolta nella sottodirectory GAC appropriata (GAC_32 o GAC_64), ma ho cercato System.Windows.Forms.dll nel GAC e l'ho trovato in:

C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ System.Windows.Forms \ v4.0_4.0.0.0__b77a5c561934e089 \ System.Windows.Forms.dll

Nota "GAC_MSIL". In che modo questa DLL riesce a racchiudere un'API nativa a 32 bit e rimanere linkabile in un'applicazione a 64 bit? E perché non posso usare una strategia simile per creare una singola DLL C# che si collega a una libreria nativa a 32 bit e che sia ancora eseguibile in modalità 64 bit?

+0

È perché gli assembly .NET non sono compilati nelle istruzioni del processore. Si compilano in una [lingua intermedia] (https://en.wikipedia.org/wiki/Common_Intermediate_Language), che quindi viene eseguita attraverso il framework .NET e viene tradotta in istruzioni del processore in fase di runtime. – pquest

+0

@pquest, penso di capirlo molto ma non vedo come risponde alla mia domanda. Puoi elaborare? – adv12

+0

Basta caricare la versione corretta della dll nativa prima di chiamare qualsiasi api? Ecco come funziona la maggior parte degli assembly che funziona in modo nativo. –

risposta

0

Opzione 1: in GAC è possibile registrare 2 versioni di assembly one 32 e one 64 bit con gli stessi nomi identici. Oracle DB Driver per .NET utilizza questa strategia.

Opzione 2: Con l'assembly che sarà AnyCPU distribuirà due versioni di DLL nativa e scegliere la DLL corretta al runtime (SQLite funziona così). Dato che .NET Framework è abbastanza intelligente da caricare la versione corretta della DLL nativa tramite P/Invoke (Using a 32bit or 64bit dll in C# DllImport)