2009-05-13 11 views
5

Ho un progetto di Visual Studio che si basa su diversi riferimenti DLL. Ecco un esempio di tali riferimenti nel mio csproj:Come impedire a Visual Studio di interrompere la copia di DLL durante la generazione senza la mia autorizzazione?

<ItemGroup> 
    <Reference Include="Class1.Project1"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project1.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
    <Reference Include="Class1.Project2"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project2.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
</ItemGroup> 

Tuttavia, quando includo questa classe come dipendenza progetto in un progetto di sito web, Visual Studio è trovare le dipendenze delle dipendenze indicate sopra. Durante la compilazione, Visual Studio imposta automaticamente la proprietà "Copia locale" su "Vero" e copia queste dipendenze nella directory ~/bin del mio sito web.

Questo, a sua volta, sovrascrive le versioni dei file DLL che già esistono in questa directory. Questo fa sì che il seguente errore:

Could not load file or assembly 'Class5.Project5, Version=3.6.1861.2, Culture=neutral, PublicKeyToken=dfeaee0e3978ac79' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Come faccio a rendere Visual Studio impostazione predefinita, il "copia locale" su "False" per tutto? Non voglio che Visual Studio copi automaticamente i file DLL durante la compilazione. Né voglio legare la mia build a versioni specifiche di una DLL.

risposta

1

Ho avuto questo problema una volta,

su Pubblica: Il modo più semplice per prevenire la scrittura sui file dll esistenti è quello di impostare loro come ReadOnly. Riceverai un avviso sulla pubblicazione per ogni file che non è stato possibile sostituire ma farà il lavoro.

On Build: Per disattivare automaticamente CopyLocal, è necessario posizionare i file dll sul GAC.

0

Perché c'erano già altre versioni nella directory bin?

In ogni caso, mi chiedo se si otterrebbe lo stesso problema utilizzando un progetto di applicazione Web. Poiché si tratta di un progetto, ha un singolo file che elenca i riferimenti diretti e, se si tratta di riferimenti di progetto (riferimenti all'output di altri assembly nella stessa soluzione), MSBUILD può garantire che venga utilizzata la versione corretta.

Verificare se è possibile riprodurre questo iniziando con un nuovo progetto di applicazione Web e aggiungendo semplicemente i riferimenti.

2

Mi sembra di avere più progetti configurati per l'output nella stessa directory - è vero?

In tal caso, è necessario rivedere la configurazione come presuppone Visual Studio (anzi, richiede) che ogni progetto ha una directory di output univoca.

Inoltre, hai scritto:

This, in turn, is overwriting the versions of the DLL files that already exist in this directory.

Dove questi file esistenti sono venuti da?

Visual Studio presuppone che abbia pieno diritto di apportare qualsiasi modifica ritenga opportuno nelle directory di output di build: provare a discuterne è una buona strada per un nuovo mondo di dolore.

(Purtroppo, parlo per esperienza. Sigh.)

+0

VS non richiede che ogni progetto abbia una directory di output univoca. Dove lavoro, abbiamo oltre 1.000 progetti che generano tutto in una directory single bin. (Il trucco è creare i tuoi riferimenti da questa directory di output.) Usiamo nant per popolare i prerequisiti di build e pulire la directory di output tra le build di debug e release. Probabilmente non è una buona pratica, ma sicuramente funziona. –

+0

Molto interessante! Quando ho provato questo, con VS2003, ho trovato che la compilazione non è riuscita perché i file nella directory di output erano in uso, tenuti aperti da un progetto quando un altro stava cercando di chiarire le cose. Quale versione di Visual Studio stai usando? – Bevan

0

Si potrebbe provare il seguente nel file di progetto.

<ReferenceOutputAssembly>false</ReferenceOutputAssembly> 

E quindi, nel codice provare questo.

<ItemGroup> 
    <Reference Include="Class1.Project1"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project1.dll</HintPath> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </Reference> 
    <Reference Include="Class1.Project2"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\bin\Class1.Project2.dll</HintPath> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    </Reference> 
</ItemGroup> 
Problemi correlati