2011-11-03 13 views
8

Ho un servizio WCF che contiene un codice C#, che fa riferimento a una DLL C++/CLI, che fa riferimento ad alcune DLL native. Includo tutte le DLL necessarie nella cartella bin per la mia applicazione IIS, ma quando IIS carica le DLL gestite, sembra essere copiandoli in una directory profondo come:Come si ottiene IIS per caricare una DLL nativa a cui fa riferimento il servizio WCF?

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

Si copia ogni DLL gestita al suo la propria directory e la carica. Quando arriva al mio C++/CLI DLL, lo copia in una directory come sopra, e quindi non è in grado di caricare le dipendenze. Se copio manualmente tutte le DLL native in questa cartella, verrà eseguito, ma questa non è una soluzione eccezionale.

My web.config è uno stock creato da VS, con un endpoint definito in base a un articolo 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> 

Come posso recuperare automaticamente queste DLL?

+0

il contenuto del tuo web.config ti aiuterà a capirlo meglio –

+0

@SSamra Post è ora aggiornato –

+0

sì, non riesci a vedere niente di sbagliato, che dire del tuo AppPool è abilitato a 32 bit? è possibile trovare il pool di app sotto IIS \ Pool di applicazioni e selezionarne uno sotto il quale si esegue l'applicazione Web –

risposta

9

Da this post, sembra che la DLL native devono essere disponibili in determinate directory o sul percorso:

La causa principale di questo problema è nel modo in cui il sistema operativo carichi nativa DLL in fase di esecuzione . Le DLL native vengono caricate utilizzando la logica seguente che non include i file temporanei ASP.net né la cartella applicazioni/bin. Questo problema si verifica anche in qualsiasi applicazione .Net se la DLL nativa non è inclusa nella cartella/bin con il file .EXE o se la DLL non si trova nella variabile di ambiente Path.

  1. La directory da cui è stata caricata l'applicazione. Nel caso di ASP.Net, questo verrà risolto in% windir% \ Microsoft.Net \ Framework \ v ### \ o% windir% \ system32 \ inetsrv per IIS 6.
  2. La directory corrente. Nel caso di ASP.Net, questo verrà risolto in% windir% \ System32 \ inetsrv per IIS 6. Se si utilizza il server Web incorporato, questo risolve un percorso in C: \ Programmi \ Microsoft Visual Studio 8
  3. La directory di sistema di Windows . Utilizzare la funzione GetSystemDirectory per ottenere il percorso di questa directory.
  4. La directory di Windows. Utilizzare la funzione GetWindowsDirectory per ottenere il percorso di questa directory.
  5. Le directory che sono elencate nella variabile di ambiente PATH.

Le soluzioni proposte sono i seguenti:

  1. Usa DllImport per caricare la DLL utilizzando un percorso relativo o assoluto runtime.
  2. Impostare la variabile di ambiente PATH in modo che il processo ASP.Net possa individuare la DLL C++. È possibile impostare questa proprietà in fase di runtime in modo che lo influenzi solo il processo che esegue il codice. È inoltre possibile impostare questo a livello globale nella proprietà del sistema (variabile di ambiente | PATH proprietà).Impostando questo programma a livello di programmazione non è necessario un riavvio e è possibile puntare il PERCORSO nella cartella/bin dell'applicazione Web se si desidera che sia in grado di eseguire le distribuzioni XCopy dell'applicazione ASP.Net. Qui sono i passaggi per impostare il percorso a livello di programmazione da ASP.Net.

ci sono anche alcune soluzioni più complesse legate alla # 2, che coinvolgono a livello di codice l'aggiornamento del PATH.

Problemi correlati