J'utilise l'attribut Cela fonctionne sur ma machine de développement mais pas sur un pur. p>
J'ai activé la journalisation de la fusion et qui ne me montre que des assemblys gérés. P>
J'ai largué le processus à l'aide de Sysinternals Process Explorer et que cela me dit que c'est dans 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? P>
Le DLLIMPORT est un pilote USB de Silicon Labs personnalisé. [DLLIMPORT ("SIUSBXP.DLL")] P>
J'ai également utilisé l'invite de commande pour faire un [dllimport] code> 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ù. p>
C: \ Windows \ System32 code> mais je ne peux pas voir le fichier là-bas dans l'Explorateur Windows. P>
dir Si * code> dans le dossier System32 et le fichier n'est pas là. P>
4 Réponses :
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 . P>
NOTE - Celles-ci concernent une API Win32 natif, mais c'est celui qui est utilisé par le Le fichier n'est éventuellement pas affiché dans Explorer car vous devez afficher tous les fichiers allumés - de nombreuses directives communes [dllimport] code> attribut. P>
[dllimport] code> (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. P>
J'ai vérifié le spectacle à tous les fichiers et je pense qu'il est activé, avec des fichiers protégés.
dllimport code> recherche dans les chemins suivants: p>
C'est ce que j'ai supposé mais je ne trouve pas la DLL dans aucun de ces endroits.
the système de fichiers Redirecteur va donner un coup de pied à: p>
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. P>
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. P> blockQuote>
Donc, même si le processus le pense chargé de la DLL à partir de
System32 code>, il est probablement chargé de
SYSWOW64 code> et oui, les chiffres sont le mauvais chemin autour de ce que vous voulez attendre. p>
C'est en effet ce qui semble se produire. Merci.
Le code source réel derrière Dllimport est ici: P>
https: // github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/dllimport.cpp p>
Comme vous pouvez le constater, il essaie d'abord de trouver une bibliothèque non exploitée dans le cache interne de .NET. P>
Si cela échoue, mais un chemin absolu est spécifié, il charge la bibliothèque avec ce chemin. P>
Si aucun chemin absolu n'est spécifié, il ressemble à ces emplacements: P>
1) Le dossier contenant le fichier manifeste de l'assemblage contenant le DllimPort. p>
2) le dossier spécifié dans Assembly.CodeBase. P>
3) Tous les endroits où LoadLibraryExw regarde. P>
Si tout ce qui échoue, il essaie de l'interpréter comme "nom de fichier, nom de montage". P>
Ensuite, il ajoute la bibliothèque à son cache interne. P>
Peut-être que vous pouvez nous montrer la déclaration
[dllimport] code>?