Meilleur auteur de réponses
Problème d’appel d’une assembly non managée au sein d’une application ASP.NET

Question
-
Bonjour,
nous essayons d'utiliser une assembly non managée au sein d'une application ASP.NET mais nous n'y arrivons pas. Voici la description du problème :
Contexte logiciel :
Serveur : Windows Server 2003.
IIS 6.0
AspNet 2.0.50727
Redistribuable Visual Studio 2005 installé.
Site et assembly compilés avec Visual Studio 2005.
Framework 2.0.50727.
Enoncé du problème :
Lors de l’exécution d’un site ASP.NET, on fait appel à du code non managé écrit en C++. Afin de réaliser ceci, un wrapper C++ managé est utilisé pour permettre l’appel depuis une page du site. Pour pouvoir être publié avec le site et intégré dans le wrapper, la dll non managée supporte la CLR (mais aucune modification de code n’a été effectuée).
Le wrapper supporte la CLR oldsyntaxe. Les deux assembly sont ajoutées aux références du site web et sont placées sous le répertoire bin du site.
Sur le PC de développement, tout se déroule correctement.
Sur le Serveur, le message suivant apparaît:
Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)
Description : Une exception non gérée s'est produite au moment de l'exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails de l'exception: System.IO.FileNotFoundException: Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)
Erreur source:Une exception non gérée s'est produite lors de l'exécution de la demande Web actuelle. Les informations relatives à l'origine et l'emplacement de l'exception peuvent être identifiées en utilisant la trace de la pile d'exception ci-dessous.
Trace de la pile:[FileNotFoundException: Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)]
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +211
System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +141
System.Reflection.Assembly.Load(String assemblyString) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +32
[ConfigurationErrorsException: Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +596
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +3596761
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +46
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +177
System.Web.Compilation.WebDirectoryBatchCompiler..ctor(VirtualDirectory vdir) +267
System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(VirtualDirectory vdir, Boolean ignoreErrors) +36
System.Web.Compilation.BuildManager.BatchCompileWebDirectory(VirtualDirectory vdir, VirtualPath virtualDir, Boolean ignoreErrors) +429
System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) +73
System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +580
System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +93
System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +111
System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +54
System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +31
System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +40
System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +139
System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +120
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
Informations sur la version : Version Microsoft .NET Framework :2.0.50727.832; Version ASP.NET :2.0.50727.832
Les mêmes assembly appelées par une application WinForms fonctionnent en étant sous le répertoire courant de l‘application.
Le déplacement de la dll non managée et du wrapper sous Windows\System32 résout le problème mais n’est évidemment pas une solution envisageable.
Il ne s’agit pas d’un problème de sécurité, les droits trust level sont à Full sous web.config.
Des recherches sur Internet nous ont amené à tenter les résolutions suivantes :
-
Nommage fort de la dll C++ non managée (snk + version + langue). Ajout de la clé dans le fichier web_mediumtrust.config et passage du trust level à Medium dans web.config. -> aucun résultat.
-
Ajout de l’assembly C++ non managée dans le GAC. -> aucun résultat.
- Nommage fort de la dll C++ non managée et du wrapper (snk + version + langue). Ajout de la clé dans le fichier web_mediumtrust.config et passage du trust level à Medium dans web.config. -> aucun résultat.
-
Ajout de la dll C++ non managée et du wrapper dans le GAC. -> aucun résultat.
Est-ce que quelqu'un aurait une solution à ce problème ? Merci d'avance pour votre aide.
Tugrul Ebabil
-
Réponses
-
Bonjour,
L'utilisation de msvcr71d.dll indique que votre dll non managée a été compilée en mode Debug. Recompilez-là en mode Release.
Cordialement
Gilles TOURREAU - MVP C#- Marqué comme réponse Gilles TOURREAUModerator samedi 4 juillet 2009 21:30
Toutes les réponses
-
-
Bonjour,
L'utilisation de msvcr71d.dll indique que votre dll non managée a été compilée en mode Debug. Recompilez-là en mode Release.
Cordialement
Gilles TOURREAU - MVP C#- Marqué comme réponse Gilles TOURREAUModerator samedi 4 juillet 2009 21:30