6
votes

Quelle dll est [Dllimport] chargement?

J'utilise l'attribut [dllimport] pour importer une DLL natif dans mon application, mais la DLL, le chargement n'est pas dans le dossier BIN local. Il est chargé d'ailleurs sur le système, mais je ne peux pas travailler là où.

Cela fonctionne sur ma machine de développement mais pas sur un pur.

J'ai activé la journalisation de la fusion et qui ne me montre que des assemblys gérés.

J'ai largué le processus à l'aide de Sysinternals Process Explorer et que cela me dit que c'est dans C: \ Windows \ System32 mais je ne peux pas voir le fichier là-bas dans l'Explorateur Windows.

Il peut être intéressant de noter que je cours 64 bits Windows 7 mais que la DLL supporte uniquement X86, donc j'ai dû forcer mon application faire X86. Y a-t-il une sorte de redirection qui change dans lequel les fichiers x86 sont chargés?

Le DLLIMPORT est un pilote USB de Silicon Labs personnalisé. [DLLIMPORT ("SIUSBXP.DLL")]

J'ai également utilisé l'invite de commande pour faire un dir Si * dans le dossier System32 et le fichier n'est pas là.


1 commentaires

Peut-être que vous pouvez nous montrer la déclaration [dllimport] ?


4 Réponses :


1
votes

Vous voulez lire ceci - Fonction LoadLibrary et, à partir de cela, vous souhaitez également lire ceci Ordre de recherche de la bibliothèque de liaison dynamique .

NOTE - Celles-ci concernent une API Win32 natif, mais c'est celui qui est utilisé par le [dllimport] attribut.

Le fichier n'est éventuellement pas affiché dans Explorer car vous devez afficher tous les fichiers allumés - de nombreuses directives communes [dllimport] (par exemple kernel32 ) ciblent Win32 dlls , qui sont classés comme des fichiers système d'exploitation et sont donc cachés par défaut.


1 commentaires

J'ai vérifié le spectacle à tous les fichiers et je pense qu'il est activé, avec des fichiers protégés.



1
votes

dllimport recherche dans les chemins suivants:

  1. DLL actuellement chargés (si elle est déjà chargée, il n'est pas nécessaire de rechercher le fichier)
  2. Le répertoire du module exécutable pour le processus en cours
  3. le répertoire actuel.
  4. répertoire "système". (C'est-à-dire C: \ Windows \ System32)
  5. Le répertoire "Windows". (C'est-à-dire C: \ Windows)
  6. Les répertoires répertoriés dans la variable d'environnement de chemin.

1 commentaires

C'est ce que j'ai supposé mais je ne trouve pas la DLL dans aucun de ces endroits.



4
votes

the système de fichiers Redirecteur va donner un coup de pied à:

Le répertoire% Windir% \ System32 est réservé aux applications 64 bits. La plupart des noms de fichiers DLL n'ont pas été modifiés lorsque des versions de 64 bits des DLL ont été créées, des versions de 32 bits des DLL sont stockées dans un répertoire différent. WOW64 masque cette différence en utilisant un redirecteur de système de fichiers.

Dans la plupart des cas, chaque fois qu'une application 32 bits tente d'accéder au% Windir% \ System32, l'accès est redirigé vers% Windir% \ sswow64.

Donc, même si le processus le pense chargé de la DLL à partir de System32 , il est probablement chargé de SYSWOW64 et oui, les chiffres sont le mauvais chemin autour de ce que vous voulez attendre.


1 commentaires

C'est en effet ce qui semble se produire. Merci.



2
votes

Le code source réel derrière Dllimport est ici:

https: // github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/dllimport.cpp

Comme vous pouvez le constater, il essaie d'abord de trouver une bibliothèque non exploitée dans le cache interne de .NET.

Si cela échoue, mais un chemin absolu est spécifié, il charge la bibliothèque avec ce chemin.

Si aucun chemin absolu n'est spécifié, il ressemble à ces emplacements:

1) Le dossier contenant le fichier manifeste de l'assemblage contenant le DllimPort.

2) le dossier spécifié dans Assembly.CodeBase.

3) Tous les endroits où LoadLibraryExw regarde.

Si tout ce qui échoue, il essaie de l'interpréter comme "nom de fichier, nom de montage".

Ensuite, il ajoute la bibliothèque à son cache interne.


0 commentaires