2009-02-03 12 views
14

Un'applicazione DotNet nativa carica tutti gli assembly di riferimento (ei loro riferimenti) al primo utilizzo. Tuttavia, un ASP.NET caricherà tutti gli assembly di riferimento (ei loro riferimenti) al primo accesso.Come impedire a ASP.NET di caricare tutti gli assiemi dal contenitore al primo caricamento

  1. Questa comprensione è corretta?

  2. C'è un modo per forzare ASP.NET a caricare gli assembly su richiesta (come le applicazioni locali)?

  3. Lo scenario specifico che sto cercando di risolvere è:

    • La cartella bin contiene 2 file: A.dll e B.dll.
    • A.dll riferimenti B.dll.
    • B.dll riferimenti C.dll che si trova da qualche altra parte nel sistema. In questo caso manca C.dll.
    • A.dll viene caricato (utilizzando la riflessione) dall'applicazione principale.
    • L'errore riscontrato (Impossibile caricare il file o il gruppo ...) si riferisce a una dipendenza mancante di B.dll.
    • Vogliamo che l'applicazione funzioni normalmente se manca C.dll in quanto questo è un componente facoltativo dell'applicazione principale.
    • Non abbiamo alcun controllo sul contenuto di B.dll o C.dll.

risposta

2

carichi ASP.NET tutte le assemblee necessarie perché il processo di lavoro crea un dominio app con tutte le assemblee richieste per ogni istanza.

se si desidera caricare assiemi su richiesta, provare a utilizzare il riflesso in questo modo per controllare quali e quando caricare i propri assiemi.

** Edit: **

se doesnt hanno il controllo su B e C, ma lei sta dicendo che ha bisogno di B C a correre, e A ha un riferimento concreto a B. A me suona come avete bisogno Componenti ABC per funzionare, puoi provare a rimuovere la dipendenza B da A rendendola leggera.

È possibile utilizzare la riflessione per caricare B da A, ma B ha ancora bisogno di C perché causerà ancora problemi.

come viene compilata la soluzione senza il componente C?

è C memorizzato nel GAC?

+0

Grazie per aver seguito le mie modifiche Oscar. C è disponibile al momento della compilazione ma non può essere spedito con l'applicazione principale. Hai ragione che ABC funziona tutti insieme e non può funzionare l'uno senza l'altro. Tuttavia, si noti che l'applicazione principale funzionerà normalmente senza ABC. – Iain

23

Per rispondere al punto 3, l'impostazione che causa il caricamento di tutti gli assembly nella cartella bin al primo accesso si trova nel file C: \ winnt \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ web.config (a seconda del proprio ambiente). Cut-down estratto da quel file:

<system.web> 
    <compilation> 
     <assemblies> 
      <add assembly="*" /> 
     </assemblies> 
    </compilation> 
</system.web> 

Tutti i gruppi che corrispondono al carattere jolly vengono caricati come parte della compilazione iniziale.

Modificando il web.config per l'applicazione (NON l'DotNet globale uno) per includere il gruppo di servizi web e di escludere il match wildcard, sembra che l'applicazione può funzionare se le dipendenze opzionali mancano:

<system.web> 
    <compilation> 
     <assemblies> 
      <remove assembly="*" /> 
      <add assembly="Main.Application.WebService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YOURKEYHERE" /> 
     </assemblies> 
    </compilation> 
</system.web> 

Stiamo ancora sperimentando questo, quindi non siamo sicuri se questo risolve completamente il problema o ha effetti collaterali insoliti.

+2

Questo è grandioso, grazie per il post! L'ho usato per escludere un assembly .Net che era legato in anticipo a una dll non gestita, che stava causando il temuto impossibile trovare l'assembly o una delle sue dipendenze. Quindi, per essere in grado di trovare la dll non modificata quando era effettivamente necessario, utilizzare il metodo LoadLibrary trovato qui: http://stackoverflow.com/questions/377181/32-or-64-bit-dll-loading-from-net -managed-code/652845 # 652845 –

+0

Questo è stato un risparmiatore di vita. Grazie –

+0

'' 'funziona? – Gqqnbig

Problemi correlati