È una proprietà in fase di compilazione!
Una delle cose più importanti da sapere è che "Versione specifica" è una proprietà che ha effetto in fase di compilazione e non in fase di esecuzione.
Cos'è tutto questo?
Quando viene creato un progetto, i riferimenti di assieme del progetto devono essere risolti al fine di trovare gli assiemi fisici che il sistema di generazione dovrebbe usare. Se viene eseguito il controllo "Versione specifica" (vedere la sezione "Quando è selezionata la" Versione specifica "?"), Influisce sul risultato del processo di risoluzione dell'assembly:
- Il sistema di generazione individua un assembly fisico che può potenzialmente utilizzare
- Il sistema di generazione confronta la versione dell'assembly fisico con la versione dell'assembly memorizzata nel file .csproj per il riferimento dell'assembly
- Se le due versioni dell'assieme sono esattamente le stesse, il processo di risoluzione ha esito positivo e l'assemblaggio fisico trovato viene utilizzato per la compilazione
- Se le due versioni dell'assembly non corrispondono, l'assemblaggio fisico viene scartato e il processo di risoluzione continua individuando l'assembly potenziale successivo
- Se non è possibile individuare più potenziali assiemi fisici, il processo di risoluzione non riesce. Ciò provoca un avviso del compilatore (avviso MSB3245) che indica che non è stato possibile risolvere il riferimento.
- È interessante notare che la build continua quindi! Se il codice non ha riferimenti effettivi all'assembly, la compilazione ha esito positivo (con l'avviso precedentemente citato). Se il codice ha riferimenti, la compilazione fallisce con un errore che sembra che il codice stia usando tipi o spazi dei nomi sconosciuti. L'unica indicazione per cui la build veramente fallito è il MSB3245 avvertimento.
Ordine in cui vengono risolti gli assiemi
L'ordine in cui il processo di risoluzione degli assembly individua i potenziali assembly sembra essere questo:
- L'assembly a cui fa riferimento l'
<HintPath>elemento nel file .csproj
- Il percorso di output del progetto
- Il GAC
Notare che se nel GAC esistono diverse versioni dell'assembly, il processo di risoluzione tenta innanzitutto di risolvere l'assembly con la versione più alta. Questo è importante solo se il controllo "Versione specifica" non viene eseguito.
Quando viene selezionata la "Versione specifica"?
Visual Studio basa la sua decisione sull'esecuzione del controllo "Versione specifica" su due informazioni contenute nel file .csproj:
- La presenza o l'assenza
<SpecificVersion>dell'elemento e il suo valore (se presente)
- La presenza o l'assenza di informazioni sulla versione nel riferimento dell'assembly
Ecco come appare un tipico riferimento di assieme con le informazioni sulla versione:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
Ecco come appare il riferimento all'assemblaggio senza le informazioni sulla versione:
<Reference Include="Foo">
[...]
La tabella seguente mostra quando viene eseguito il controllo "Versione specifica" e quando non lo è.
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
La cosa sorprendente qui è che non viene eseguito alcun controllo se entrambe <SpecificVersion>e le informazioni sulla versione sono assenti (caso 6). Mi sarei aspettato che il controllo venisse eseguito e fallisse sempre (come nel caso 2) perché nella mia comprensione l'assenza di <SpecificVersion>implica il valore predefinito "Vero". Questa potrebbe essere una stranezza di Visual Studio 2010 in cui ho eseguito i miei test.
Quando si esaminano le proprietà di un riferimento di assembly nell'interfaccia utente di Visual Studio (selezionare il riferimento e premere F4), il valore visualizzato per la proprietà "Versione specifica" indica se Visual Studio eseguirà o meno la "Versione specifica" dai un'occhiata. Nel caso 6 l'interfaccia utente mostrerà "True", sebbene l' <SpecificVersion>elemento non sia presente nel file .csproj.
Effetti collaterali su "Copia locale"
Se la proprietà "Copia locale" è impostata su "True" ma il processo di risoluzione dell'assembly non riesce a causa del controllo "Versione specifica", nessun assembly viene copiato.
Materiale di riferimento