2012-07-24 11 views
5

Eventuali duplicati:
Loading x86 or x64 assembly.NET collega libreria specifica piattaforma

sto cercando di compilare qualsiasi progetto di CPU NET, ma devo collegare libreria SQLite, che ha versioni differenti per piattaforme x86 e x64. Cambiare solo le versioni DLL per x64 non aiuta, l'applicazione non si avvia, ho bisogno di ricompilare il codice usando il riferimento x64. Quando aggiungo entrambi i riferimenti x86 e x64 non riesce a compilare, a causa di conflitti. Non riesco a compilare l'applicazione usando x86, perché una delle librerie COM di sistema che sto utilizzando non funziona con WOW64.

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

quindi ho bisogno di costruire qualsiasi progetto di CPU, ma l'unica soluzione a questo problema che vedo in questo momento sta avendo progetti duplicati per x86 e x64. C'è qualcosa di meglio?

UPDATE

Quando mi riferisco librerie x64 in progetto, ma provo a caricare le librerie x86 ottengo la seguente eccezione.

The located assembly's manifest definition does not match the assembly reference.

+0

Grazie. Ho visto messaggi del genere, ma il problema sta cambiando la DLL solo non aiuta molto. Non funziona ancora quando copio DLL a 64 bit nella mia cartella, ho ancora bisogno di ricompilare l'applicazione facendo riferimento a quelle librerie a 64 bit. Sto facendo qualcosa di sbagliato? E anche io non capisco quale versione dovrei fare riferimento? – axe

+1

Sì. Le librerie native devono avere nomi identici, ma devono trovarsi in cartelle diverse (come le sottocartelle della tua app). In fase di runtime si chiama 'SetDllDirectory' per far sì che il sistema operativo guardi nella cartella corretta a seconda del bitness. Oppure usa l'evento 'AppDomain.CurrentDomain.AssemblyResolve' come [suggerito da Rover] (http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754). Non si fa riferimento direttamente a tali librerie, lo fa il wrapper gestito SQLite. Il tuo codice farà in modo che il wrapper carichi la versione corretta della libreria nativa sottostante. – GSerg

+0

Ho provato ancora una volta, non funziona per me. L'applicazione si arresta in modo anomalo all'avvio. Il problema è che sto facendo riferimento alle librerie x64 nel progetto, ma seleziono le librerie x86 in fase di esecuzione. Se costruisco la mia applicazione usando le librerie x86 funziona perfettamente su x86 windows, altrimenti non funziona. – axe

risposta

6

Il problema principale è stato il fatto che ero utilizzando versioni diverse di SQLite per x86 e x64. metodo

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args) 
{ 
    string platform = Environment.Is64BitProcess ? "x64" : "x86"; 
    string assemblyName = new AssemblyName(args.Name).Name; 
    string assemblyPath = Path.Combine(
     Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll"); 

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath); 
} 

e impostare gestore di eventi

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

nel principale punto di ingresso dell'applicazione ho aggiunto. Ora carica l'assembly x86 per piattaforme x86 e x64 su piattaforme a 64 bit in modo corrispondente.

Grazie.