Chargement x86 ou x64 de l'assemblée
J'ai deux versions de System.Data.SQLite.DLL - pour les architectures x86 et x64 plateforme. La version x86 conserve dans le dossier de l'application et la version x64 garde en appFolder\dossier x64.
L'application compilée en tant que AnyCPU.
Comment puis-je charger besoin de la version de SQLite en fonction de la plate-forme windows?
OriginalL'auteur Rover | 2010-09-24
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez SQLite à partir de http://system.data.sqlite.org, l'System.Data.SQLite.DLL est entièrement gérée. Il y a un sous-jacente DLL native, SQLite.Interop.DLL, qui a besoin de changer en fonction du processus (32 - ou 64-bit).
- Je déployer les bibliothèques natives ".\Native\X64" pour 64 bits et ".\Native\X86" pour 32-bit. Au moment de l'exécution de P/Invoke SetDllDirectory pour définir le chargement des DLL du répertoire pointant vers le chemin correct pour le processus.
http://msdn.microsoft.com/en-us/library/ms686203(v=vs. 85).aspx
(Notez que je ne suis pas familier avec l'architecture de l'héritage System.Data.SQLite.DLL la version de http://sqlite.phxsoftware.com)
OriginalL'auteur Jason Morse
Certains antivir progs empêcher SetDllDirectory() - m'a fallu beaucoup de temps pour s'en rendre compte.
Nous sommes à l'aide de
pour charger le x64 DLL avec chemin d'accès explicite. Il est chargé à ce point et les .NET Runtime utiliser les DLL de la mémoire au lieu de chercher sur le disque.
myass
🙂N'a pas fonctionné dans mon cas. Même si j'ai vérifié avec le débogueur, que le natif médiathèque est chargé correctement. SQLite encore déclenche une exception à propos de native DLL manquant.
OriginalL'auteur Patrick
Il y a un support intégré pour cette 1.0.80.0 et plus tard.
Toutefois, pour l'amener à travailler dans mon propre plug-in j'ai aussi dû ajouter ceci avant de référencement de SQLite pour la première fois:
Voir cette question: Nouveau SQLite mixte assemblées
OriginalL'auteur johv
Je suis surpris que cela fonctionne à tous. Il doit trouver la version x86 premier et échec. L'échec d'une liaison d'assembly n'est pas de produire une autre tentative par AssemblyResolve.
Clairement, le CLR ne peut pas trouver la version x86 ou ce serait un échec en x64 mode ainsi. En d'autres mots, lorsque vous corrigez le problème, vous aurez briser le code 64 bits. Chase x86 le problème en premier lieu, l'utilisation Fuslogvw.exe pour voir les dossiers sont examinés pour l'assemblée.
Une vraie solution doit inclure le déplacement de la x86 assemblée dans un dossier distinct ainsi et le réglage de votre gestionnaire d'événement en conséquence. Vous pouvez tester IntPtr.Taille pour savoir si vous êtes en cours d'exécution en mode 64 bits (Taille == 8). Assurez-vous également de générer un nom de chemin complet, en utilisant le chemin d'accès relatif, comme vous le faites maintenant, peut causer l'échec lors de l'application du répertoire de travail n'est pas placé à l'endroit où vous désirez qu'il soit. De l'assemblée.GetEntryAssembly().L'emplacement vous permet de vous le chemin de l'EXE.
Hmm, je ne pense pas que ça change un peu ma réponse. Le dernier paragraphe vous explique comment le faire correctement.
Ok, j'ai vérifié plate-forme, a trouvé nécessaire de montage. Que dois-je faire pour le chargement de l'assemblée domaine d'application?
Vous voulez dire que vous voulez charger dans une non-valeur par défaut domaine d'application? Mieux de commencer une nouvelle question.
OriginalL'auteur Hans Passant
Vous pouvez utiliser De l'environnement.Is64BitProcess à identifier les processus 64 bits. (Je voudrais essayer d'éviter d'attraper les exceptions de contrôle de flux dans la mesure du possible.)
Comment alors? Ne vous avez certainement 64 bits .Installée NETTE?
J'utilise .NET 3.5 ont pas cette variable. Je pense que je peux vérifier la version de la plate-forme, mais seulement d'éviter de capturer des exceptions, mais nécessaire de l'assemblée n'est pas chargé.
Ah Ah, je suis avec vous maintenant. Vous dites que le 64 bits assemblée ne parvient pas à charger sur la plate-forme 64 bits, plutôt que ce que vous ne savez pas comment détecter la plate-forme locale?
Le problème, c'est le chargement de l'assemblée 🙂
OriginalL'auteur Paul Ruane
Ne pourriez-vous utiliser la source de SQLite comme un projet distinct dans votre solution au lieu d'un fichier de l'assemblée? À l'aide de AnyCPU le système lui-même s'occupera de tout et vous n'avez pas à faire dans le code...
Cela ne réglera aucun problème, puisque l'architecture de la machine de développement n'est pas toujours le même que le déploiement de la machine. N'importe quel CPU ne fonctionne que pour .NET assemblées, pas de Dll natives(sorcière utiliser SQLITE sous le capot)
OriginalL'auteur timtos
OriginalL'auteur Ryan.Bartsch