2011-09-24 14 views
6

Ho bisogno di fare riferimento a una DLL che è disponibile in 2 versioni (una per 32 bit e una per 64 bit). Il mio obiettivo è creare un'applicazione web che funzioni su entrambi i sistemi a 32 e 64 bit.Utilizzo di una dll specifica a 32 bit o 64 bit in base al processo bitness

ho pensato di riferimento il gruppo a 32 bit per impostazione predefinita e utilizzando l'evento AssemblyResolve per caricare la versione a 64 bit (se il caricamento della versione a 32 bit fallito):

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve; 
    // Try LoadAssembly ... 
} 

static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var path = string.Format(@"...\lib_x64\{0}.dll", args.Name); 
    return Assembly.LoadFrom(path); 
} 

Ma anche quando si verifica un BadImageFormatException, il gestore _AssemblyResolve sarà non essere chiamato. C'è un altro modo per ottenere il comportamento proposto?

risposta

0

Vedi answers for dealing with this for System.Data.SQLite.

Penso che il metodo proposto dovrebbe funzionare ma è necessario spostare la versione a 32 bit in modo che non possa essere trovata per impostazione predefinita, quindi _AssemblyResolve viene sempre chiamato per quella DLL. Questa è solo una supposizione.

+0

Sembra che non ci sia un modo migliore. Grazie comunque. – ollifant

1

modo più semplice ma meno flessibile dal mio punto di vista è esplicitamente specificare piattaforma specifici riferimenti a file di csproj usando Condition:

<ItemGroup Condition=" '$(Platform)' == 'x86' "> 
    <Reference Include="MyAssemblyx86"> 

Inoltre è possibile farlo utilizzando in modo dinamico Assembly.Load(AssemblyName) overload del metodo. parametro è di tipo AssemblyName che espone la proprietà AssemblyName.ProcessorArchitecture che potrebbe essere impostata su Nessuno, MSIL, X86, X64, IA64, AMD64

Una cosa si potrebbe anche esaminare è la Publisher Policy File funzione e riga di comando argomento /platform:processorArchitecture

+0

L'utilizzo di una condizione all'interno del file di progetto fa una distinzione solo al momento della compilazione. Pertanto, sarebbe ancora necessario ridistribuire 2 versioni differenti. – ollifant

+0

La soluzione Assembly.Load funzionerebbe, ma ciò richiederebbe l'utilizzo di molta riflessione. O forse anche la dinamica andrebbe bene. – ollifant

+0

@ollifant: .NET Framework supporta due metodi di risoluzione degli assembly, tramite riferimenti statici o dinamici. Riferimento dinamico - Assembly.Load()/etc, associazione di riferimento statico tramite il file di progetto o come dipendenza di un altro riferimento tramite metadati. Una cosa è anche possibile esaminare la funzione 'File criteri editore 'e l'argomento della riga di comando'/platform: processorArchitecture' – sll

Problemi correlati