Assemblée référera ne se trouve pas, même si l'ensemble est dans le même répertoire

StackOverflow https://stackoverflow.com/questions/3761960

Question

Nous développons actuellement un add-in pour certains logiciels. Nous avons décidé de développer dans .NET, même si l'application est écrite dans une langue maternelle. Comme il y avait des problèmes pour créer directement l'interface externe dans .NET, nous avons décidé de construire une DLL de pont en C ++ / CLI, qui fait une initialisation de base et charge ensuite notre assemblée géré et crée un contrôle utilisateur à partir de cela.

Dans un complément dans le fichier .ini, le C ++ / CLI DLL est référencé par nom, de sorte que l'application se charge à partir de là. cependant, est simplement référencé à partir de la DLL C ++ / CLI (comme référence géré), la DLL .NET, de sorte que les types exportés sont disponibles. Dans cette configuration, howerver, l'application se bloque le chargement de la DLL .NET.

Nous avons rapidement constaté que nous pouvions souscrire à l'événement AppDomain.AssemblyResolve pour charger l'assemblage .NET à partir du même répertoire dans lequel la DLL C ++ / CLI est, de sorte que le problème lui-même est résolu.

La vraie question est: Pourquoi ne pas le chargeur trouver la DLL .NET, même si elle est dans le même répertoire que le référencement assemblage il? J'ai toujours attendu que les ensembles de chargement regardera d'abord dans le même répertoire, plutôt que dans le répertoire de travail courant. Pourquoi un exécutable trouver un assemblage si elle change son répertoire de travail alors? Ou sont des choses différentes si le CLR est invoqué par le chargement d'un C ++ / CLI assemblage (plutôt qu'une application gérée pure)?

Était-ce utile?

La solution

Je vous recommande d'utiliser fuslogvw.exe pour analyser les problèmes de ce genre:

  

Fuslogvw.exe et le diagnostic. problèmes NET liant l'assemblage

Et, bien sûr, l'outil polyvalent pour l'analyse des problèmes avec des fichiers non trouvé:

  

Process Monitor

Autres conseils

Le chemin de sondage pour des ensembles arriver à être un peu imprévisible quand un EXE non géré démarre le processus. Juste parce qu'il a chargé un C ++ / CLI DLL, peut-être par LoadLibrary ou SetDllDirectory, fait pas aucune influence sur le chemin de sondage pour le CLR.

Mais c'est juste deviner. Il n'y a pas besoin de deviner quand vous regardez la sortie produite par Fuslogvw.exe. Il vous montre exactement ce qui est sondé et quelles politiques sont appliquées. Vous résoudre le problème avec un fichier app.exe.config (élément de sondage) ou bien par AssemblyResolve.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top