2012-07-24 10 views
5

Mögliche Duplizieren:
Loading x86 or x64 assembly.NET AnyCPU Projekt verbindet plattformspezifische Bibliothek

Ich versuche Jedes CPU .NET-Projekt zu kompilieren, aber ich habe SQLite-Bibliothek zu verknüpfen, die hat verschiedene Versionen für x86- und x64-Plattformen. Das Ändern von nur DLL-Versionen zu x64 hilft nicht, Anwendung startet nicht, ich muss Code mit x64-Referenz neu kompilieren. Wenn ich sowohl x86- als auch x64-Referenzen hinzufüge, kann es aufgrund von Konflikten nicht kompiliert werden. Ich kann keine Anwendung mit x86 kompilieren, weil eine der System-COM-Bibliotheken, die ich verwende, unter WOW64 nicht funktioniert.

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/

so brauche ich Jedes CPU Projekt, aber die einzige Lösung für dieses Problem, das ich im Moment doppelte Projekte mit für x86 und x64 sehen zu bauen. Gibt es etwas Besseres?

UPDATE

Wenn ich x64-Bibliotheken in Projekt verweisen, sondern versuchen, x86-Bibliotheken Ich erhalte die folgende Ausnahme zu laden.

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

+0

Danke. Ich habe solche Posts gesehen, aber das Problem ändert DLL nur hilft nicht viel. Es funktioniert immer noch nicht, wenn ich 64-Bit-DLLs in meinen Ordner kopiere, ich muss die Anwendung, die auf diese 64-Bit-Bibliotheken verweist, noch neu kompilieren. Mache ich etwas falsch? Und ich verstehe auch nicht, auf welche Version ich verweisen soll? – axe

+1

Ja. Die nativen Bibliotheken müssen identische Namen haben, müssen sich jedoch in verschiedenen Ordnern (z. B. Unterordnern Ihrer App) befinden. Zur Laufzeit rufen Sie 'SetDllDirectory' auf, damit das Betriebssystem je nach Bitness im richtigen Ordner sucht. Oder verwenden Sie das Ereignis "AppDomain.CurrentDomain.AssemblyResolve" als [vom Rover empfohlen] (http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754). Sie verweisen nicht direkt auf diese Bibliotheken, der von SQLite verwaltete Wrapper. Ihr Code wird den Wrapper die richtige Version der zugrunde liegenden systemeigenen Bibliothek laden. – GSerg

+0

Ich habe es noch einmal versucht, es funktioniert nicht für mich. Anwendung stürzt beim Start ab. Das Problem ist, ich referenziere x64-Bibliotheken im Projekt, aber ich wähle x86-Bibliotheken zur Laufzeit. Wenn ich meine Anwendung unter Verwendung von x86-Bibliotheken erstelle, funktioniert sie perfekt in x86-Fenstern, andernfalls nicht. – axe

Antwort

6

Das Hauptproblem war die Tatsache, dass ich verschiedene Versionen von SQLite für x86 und x64 verwendet wurde. Ich habe Methode

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); 
} 

und stellen Sie Ereignishandler

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

in Punkt Hauptanwendungseintrag. Nun lädt es x86-Assembly für x86-Plattformen und x64 auf 64-Bit-Plattformen entsprechend.

Danke.