2012-11-07 8 views
14

Ho un sito MVC4 abbastanza standard e semplice.C'è un modo per cambiare .net mvc bin dir posizione?

Nella directory principale abbiamo: bin, contenuto, script, viste. Usando le impostazioni di default della DLL del progetto, chiamiamolo "web.dll" e tutti gli extra necessari vanno nella directory bin.

In qualche modo, il server di sviluppo ASP.NET e IIS7.5 sono entrambi in grado di cercare "web.dll" nella cartella bin quando ospita il sito e, se non è presente, generano un errore: "Impossibile caricare il tipo" CVD .Web.MvcApplication '". La soluzione standard per questo errore è quella di creare direttamente nella cartella bin, che non funziona per me perché ...

Per scopi di debug, mi piacerebbe essere in grado di creare Debug & Configurazioni di rilascio nel cestino/Eseguire il debug e bin/release rispettivamente e quindi distribuire entrambe le directory, quindi modificare un'impostazione in IIS, web.config, global.asax o in qualsiasi altro modo per selezionare se il build Debug o Release deve essere caricato ed eseguito dal server.

Non sono stato in grado di trovare se è possibile o se le applicazioni web .net hanno una stupida regola hard-coded che dice che tutto il codice deve vivere nella directory bin.

risposta

10

OK, quindi con l'aiuto di pochi collegamenti forniti da Sen Jacob e qualche altra ricerca ho capito che è possibile fare tutto solo usando web.config.

Prima di tutto abbiamo bisogno di fornire il nuovo percorso e dire il nome di montaggio dato che stiamo sterzo lontano dal default:

<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0"> 
      <assemblies> 
       <add assembly="Something.Web" /> 
      </assemblies>   
     </compilation> 
    </system.web> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <probing privatePath="bin\debug" /> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Ora, per qualche motivo ovunque persone suggeriscono che specifica privatePath relativa a bin dir (ovvero privatePath="debug"), tuttavia nel mio caso doveva essere relativo alla radice dell'app (ovvero come sopra). Forse è un cambiamento in .net4 o qualche altra impostazione di configurazione che mi manca, non sono sicuro; se qualcuno ha un'idea migliore sentiti libero di modificare/commentare.

In questa fase, se il server trova il file, e con successo carica l'assembly e la classe si inizierà a lamentarsi tutti i file di riferimento mancanti, che ho dovuto aggiungere accanto alla <add assembly="Something.Web" />:

<assemblies> 
     <add assembly="Something.Web" /> 
     <add assembly="System.Web.Mvc" /> 
     <add assembly="System.Web.Optimization" /> 
     <add assembly="System.Web.Helpers" /> 
     <add assembly="System.Web.WebPages" /> 
    </assemblies> 

Da quello che ho raccolto ricompila gli assembly all'avvio del sito (non sono sicuro).

Fonti: 1 2 3

+0

Le directory specificate in privatePath devono essere sottodirectory della directory della base dell'applicazione (http://msdn.microsoft.com/en-us/library/4191fzwb%28v=vs.110%29.aspx) – r03

-2

in Esplora soluzioni, fare clic destro sul vostro progetto> proprietà

scheda Prendere costruire e cambiare percorso di uscita da/bin alla ovunque si desideri ..

enter image description here

È possibile modificare la configurazione dalla casella combinata superiore a Debug/Release e impostare separatamente ciascun percorso ourput.

+3

Questo inserisce solo i file nella cartella, non indica al server che le DLL si trovano lì. Quello che sto cercando è un modo per far sapere al server che i file non si trovano nella posizione predefinita. –

+2

È questo quello che stai cercando? [Dire a IIS di caricare DLL da un'altra directory, non Bin? web.config?] (http://forums.asp.net/t/1303052.aspx) –

+0

Sì, grazie, controllando se la modifica suggerita lì funziona –

0

Ho avuto lo stesso problema.Per risolverlo, ho creato un incrocio directory chiamata "bin" per la directory di destinazione in caso di post-generazione:

if exist "$(ProjectDir)bin" rmdir "$(ProjectDir)bin" 
mklink /J "$(ProjectDir)bin" "$(TargetDir)" 

In questo modo è possibile impostare il percorso di uscita da qualche altra parte, anche completamente al di fuori della struttura di origine.

IISExpress sarà ancora eseguito dalla cartella di progetto nella struttura di origine, ma segue il bivio bin per trovare le DLL costruiti. Si noti che gli altri file verranno utilizzati dalla posizione dell'albero di origine.

Il junction viene rimosso e ricreato ogni volta, nel caso si cambino le configurazioni di build.

Assicurarsi che la directory bin non esiste già dal vecchio configurazione di compilazione, il rmdir non funziona se ci sono file nella (reale) directory bin.

Problemi correlati