Dll non gérées ne parviennent pas à charger sur ASP.NET serveur
Cette question se rapporte à une ASP.NET site internet, développé à l'origine dans VS 2005 et maintenant dans VS 2008.
Ce site web utilise deux non géré externe Dll qui ne le sont pas .NET et je n'ai pas le code source à compiler et à les utiliser comme est.
Ce site fonctionne très bien à partir de Visual Studio, de la localisation et de l'accès à ces externes Dll correctement. Toutefois, lorsque le site web est publié sur un serveur web (runnning IIS6 et ASP.NET 2.0) plutôt que sur le développement de PC, il est impossible de localiser et d'accéder à ces Dll externe, et j'obtiens l'erreur suivante:
Unable to load DLL 'XYZ.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Externes Dll se trouve dans le répertoire bin du site web, ainsi que la Dll gérées de les emballer et de tous les autres Dll pour le site web.
La recherche de ce problème révèle que beaucoup d'autres personnes semblent avoir le même problème d'accès externe non.NET Dll à partir de ASP.NET sites web, mais je n'ai pas trouvé de solution qui fonctionne.
J'ai essayé ce qui suit:
- L'exécution DÉPEND de vérifier les dépendances d'établir que les trois premiers
sont dans le répertoire System32 dans le chemin, la dernière dans le .NET 2
cadre. - J'ai mis les deux Dll et de leurs dépendances en
System32 et redémarré le serveur, mais le site encore
impossible de charger ces Dll. - A donné tous les droits pour le RÉSEAU, IIS_WPG et IUSR (pour le serveur) à
le site web de répertoire bin et redémarré, mais le site ne pouvais toujours pas
la charge de ces Dll. - Ajouté externes Dll comme des éléments existants pour les projets et mettre en
leur "Copie de Sortie" à la propriété "Copy", et le site web
ne peut toujours pas trouver les Dll. - Également définir leur "Action de Construire" à la propriété "ressource Incorporée" et
site web ne peut toujours pas trouver les Dll.
Aucune aide avec ce problème serait grandement apprécié!
Vous devez vous connecter pour publier un commentaire.
Essayer de mettre la dll dans le dossier \System32\Inetsrv. C'est le répertoire de travail pour les services IIS sur Windows Server.
Si cela ne fonctionne pas, essayez de mettre la dll dans le répertoire System32 et la dépendance des fichiers dans le répertoire Inetsrv.
Cela se produit parce que la dll gérés obtenir ombre copiés dans un emplacement temporaire dans le cadre du .NET Framework répertoire. Voir http://msdn.microsoft.com/en-us/library/ms366723.aspx pour plus de détails.
Malheureusement, la dll non gérées ne PAS avoir copié et le ASP.NET processus ne sera pas en mesure de les trouver quand il a besoin de les charger.
Une solution simple est de mettre les dll non gérées dans un répertoire qui se trouve dans le chemin d'accès système (de type "chemin d'accès" à la ligne de commande pour voir le chemin d'accès sur votre ordinateur), de sorte qu'ils peuvent être trouvés par les ASP.NET processus. Le répertoire System32 est toujours dans le chemin d'accès, afin de mettre la dll non managées il fonctionne toujours, mais je vous recommande l'ajout d'un autre dossier pour le chemin d'accès, puis ajouter la dll là pour éviter de polluer le répertoire System32. Un gros inconvénient de cette méthode est que vous devez renommer la dll non managées pour chaque version de votre application et vous pouvez rapidement vous avez votre propre l'enfer des dll.
Comme une autre de mettre la dll dans un dossier qui est déjà dans le chemin d'accès (comme system32) vous pouvez modifier le chemin d'accès de la valeur dans votre processus en utilisant le code suivant
Puis quand LoadLibrary essaie de trouver la DLL non managée il analysera également searchPath. Ce peut être préférable de faire un gâchis dans System32 ou d'autres dossiers.
L'ajout de Matt réponse, c'est ce qui a finalement fonctionné pour moi pour 64-bit server 2003 /IIS 6:
Prendre un coup d'oeil avec FileMon ou ProcMon et filtre sur les noms de l'importun Dll. Cela va vous montrer quels répertoires sont analysés à la recherche de la Dll, et de toute autorisation questions que vous pourriez avoir.
Une autre option est l'intégration de la maternelle DLL en tant que ressource dans la gestion de la DLL. C'est plus compliqué ASP.NET, car il exige de l'écriture vers un dossier temporaire au moment de l'exécution. La technique est expliquée dans une autre SORTE de réponse.
Toujours la peine de vérifier le chemin d'accès variable dans vos paramètres d'environnement de trop.
Exécuter DÉPEND XYZ.dll directement, à l'emplacement que vous avez déployé pour. Si ce n'est pas révéler quoi que ce soit manquants, utilisez la fuslogvw outil dans le kit de développement platform SDK de trace de chargeur d'erreurs. Aussi, les journaux d'événements parfois contenir des informations sur les échecs de charger les Dll.
J'ai rencontré le même problème. Et j'ai essayé toutes les options ci-dessus, la copie à system32, inetpub, paramètre d'environnement path, etc rien n'a fonctionné.
Ce problème est résolu par la copie non géré dll dans le répertoire bin de service ou d'application web.
Après avoir lutté toute la journée sur ce problème et j'ai enfin trouvé une solution qui me convient. C'est juste un test, mais la méthode de travail.
Sur Application_start utiliser ceci:
(personnaliser /bin/x64 et bin/dll/x64 dossiers que nécessaire)