2011-11-03 28 views
8

Tengo un servicio WCF que contiene algún código C#, que hace referencia a un dll C++/CLI, que hace referencia a algunas DLL nativas. Incluyo todas las DLL necesarias en la carpeta bin para mi aplicación de IIS, pero cuando IIS carga los archivos DLL administrados, parece estar copiarlos en un directorio profundo como:¿Cómo consigo que IIS cargue una DLL nativa a la que hace referencia mi servicio WCF?

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\testwcf\73473be6\e625098c\assembly\dl3\aada7c33\85a7332b_2f9acc01 

Se copia a cada una DLL administrada a su propio directorio y lo carga. Cuando llega a mi DLL C++/CLI, lo copia a un directorio como el anterior, y luego no puede cargar las dependencias. Si manualmente copio todas las DLL nativas en esta carpeta, se ejecutará, pero esa no es una gran solución.

Mi web.config es el stock creado por VS, con un punto final definido en un artículo de MSDN.

<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="WcfService.Service1"> 
     <endpoint address="" 
        binding="wsHttpBinding" 
        contract="WcfService.IService1" /> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

¿Cómo puedo obtener estos archivos DLL para ser recogidos de forma automática?

+0

contenido de su web.config ayudará a entenderlo mejor –

+0

@SSamra Post ahora se ha actualizado –

+0

sí, no veo nada malo, ¿qué hay de su AppPool está habilitado para 32 bits? puede encontrar su grupo de aplicaciones en IIS \ Application Pools y luego seleccionar uno en el que esté ejecutando su aplicación web –

Respuesta

9

De this post, parece que los archivos DLL nativos tienen que estar disponibles en ciertos directorios o en el camino:

La causa principal de este problema está en la forma en que el sistema operativo cargas DLL nativa en tiempo de ejecución . Las DLL nativas se cargan usando la lógica de seguimiento que no incluye los archivos temporales ASP.net ni la carpeta applications/bin. Este problema también se producirá en cualquier aplicación .NET si el archivo DLL nativo no está incluido en la carpeta/bin con el archivo .EXE o si el archivo DLL no está en la variable de entorno de ruta de acceso.

  1. El directorio desde el que se cargó la aplicación. En el caso de ASP.Net, esto se resolverá en% windir% \ Microsoft.Net \ Framework \ v ### \ o% windir% \ system32 \ inetsrv para IIS 6.
  2. El directorio actual. En el caso de ASP.Net, esto se resolverá en% windir% \ System32 \ inetsrv para IIS 6. Si utiliza el servidor web incorporado, esto se resuelve en una ruta en C: \ Archivos de programa \ Microsoft Visual Studio 8
  3. El sistema de Windows directorio. Use la función GetSystemDirectory para obtener la ruta de este directorio.
  4. El directorio de Windows. Use la función GetWindowsDirectory para obtener la ruta de este directorio.
  5. Los directorios que son enumerados en la variable de entorno PATH.

Las soluciones ofrecidas son como sigue:

  1. Uso DLLImport para cargar la DLL utilizando una ruta relativa o absoluta en tiempo de ejecución.
  2. Establezca la variable de entorno PATH para que el proceso ASP.Net pueda localizar la DLL C++. Puede establecer esta propiedad en tiempo de ejecución para que solo afecte al proceso que ejecuta su código. También puede establecer este globalmente en las propiedades del sistema (variable de entorno | propiedad PATH ).Establecer esto mediante programación no requiere un reinicio y puede señalar la RUTA a la carpeta/bin de la aplicación web si desea para poder realizar implementaciones de XCopy de su aplicación ASP.Net. Aquí son los pasos para establecer la Ruta programáticamente desde ASP.Net.

También hay algunas soluciones más complejas relacionadas con el # 2, que implican la actualización de la programación PATH.

Cuestiones relacionadas