Je devrais ajouter : Vous ne devriez pas mettre vos dll dans \system32\ de toute façon ! Modifiez votre code, modifiez votre installateur... trouvez une place pour vos bits qui n'est PAS sous c : \windows\
Par exemple, votre installateur place vos dlls dans :
\program files\<your app dir>\
or
\program files\common files\<your app name>\
( Note : La façon dont vous faites ça est d'utiliser la variable d'environnement : %ProgramFiles% ou %ProgramFiles(x86)% pour trouver où se trouve Program Files.... vous ne devez pas supposer que c'est c : \program fichiers\ ....)
puis définit une balise de registre :
HKLM\software\<your app name>
-- dllLocation
Le code qui utilise vos dlls lit le registre, puis établit des liens dynamiques avec les dlls qui se trouvent à cet endroit.
Ce qui précède est la meilleure solution.
Vous n'installez jamais vos dlls, ou celles d'un tiers dans \system32\ ou \syswow64. Si vous devez charger statiquement, vous placez vos dlls dans votre répertoire exe (où elles seront trouvées). Si vous ne pouvez pas prévoir le répertoire de l'exe (par exemple, un autre exe va appeler votre dll), vous devrez peut-être placer votre répertoire de dll dans le chemin de recherche (évitez cela si possible !).
system32 et syswow64 sont pour les fichiers fournis par Windows... pas pour les fichiers de quelqu'un d'autre . La seule raison pour laquelle les gens ont pris la mauvaise habitude de mettre des choses à cet endroit est qu'elles se trouvent toujours dans le chemin de recherche, et que de nombreuses applications/modules utilisent la liaison statique. (Donc, si on y réfléchit bien, le vrai péché est la liaison statique -- c'est un péché dans le code natif et le code géré -- toujours toujours lier dynamiquement).
2 votes
Aussi, ceci : Windows recherche dans le répertoire de travail actuel ainsi que dans le PATH du système. Il n'y a aucun moyen de spécifier le contraire. Oh, attendez, il y en a un. Vous pouvez intégrer le chemin de recherche dans votre DLL. C'est un champ de 8 octets de long. Oui. 8 caractères.
0 votes
Cela ne semble pas être le cas sous Windows 7. Exécution d'un fichier sur une DLL dans le fichier system32 C:\Windows\system32\user32.dll C:\Windows\system32\user32.dll ; exécutable PE32 pour MS Windows (DLL) (GUI) Intel 80386 32-bit Mais pour une DLL 64-bit, il imprime exécutable PE32+ pour MS Windows (DLL) (console) assemblage Mono/.Net Notez que cette DLL est pas un assemblage .Net. Il s'agit d'une DLL native.
0 votes
Lien vers question similaire sur le superutilisateur .
12 votes
Entretien avec un ex-Microsoftie . (Pour une explication sérieuse de la façon dont cela s'est produit, voir cette réponse .)
0 votes
superuser.com/a/157301/241386 "Des raisons de rétrocompatibilité. Un grand nombre d'applications supposent des choses qu'elles ne devraient pas supposer et codent en dur les chemins."