Il progetto A utilizza log4net 1.2.13.0
e dipende dalla libreria B, che utilizza log4net 1.2.11.0
. Se lo faccio Package Manager Console> Add-BindingRedirect
, ottengo un corretto reindirizzamento obbligatorio in app.config
:Quando è necessario utilizzare i reindirizzamenti di binding?
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.13.0" newVersion="1.2.13.0" />
</dependentAssembly>
ho pensato che questo è richiesto in ordine per la costruzione da completare. Ma build riesce anche senza il reindirizzamento. Ecco quello che vedo in log di compilazione (di dettaglio impostato dettagliata):
unificata di riferimento primario "log4net, Version = 1.2.13.0, Culture = neutral, PublicKeyToken = 669e0ddf0bb1aa2a". Utilizzare questa versione invece della versione originale "1.2.11.0" in "C: \ Users \ vorou \ code \ ConsoleApplication1 \ packages \ LibraryB.dll" perché AutoUnify è "true".
Di cosa tratta AutoUnify? Quale è meglio, cioè ci sono dei vantaggi nell'avere un reindirizzamento esplicito in .config?
Inoltre, come posso ricordare, in alcuni casi è necessario per aggiungere reindirizzamenti vincolanti. Altrimenti l'applicazione esploderà in fase di runtime. Quali sono questi casi e perché la magia AutoUnify
non funziona per loro?
UPD Ecco un estratto dal MSDN su AutoUnify
:
Questo parametro viene utilizzato per le assemblee da costruzione, come le DLL, che non possono avere un file app.config normale. Se true, il grafico delle dipendenze risultante viene automaticamente trattato come se un file App.Config fosse passato al parametro AppConfigFile. Questo file App.Config virtuale ha una voce bindingRedirect per ciascun set di assembly in conflitto, in modo che venga scelto l'assembly della versione più alta. Una conseguenza di ciò è che non ci sarà mai un avvertimento riguardo alle assemblee in conflitto poiché ogni conflitto sarà stato risolto.
Sembra che i reindirizzamenti in .config non abbiano alcun ruolo nel mio caso. Il problema è che la libreria B non può soddisfare le sue dipendenze, e AutoUnify
risolve il problema con la regola "fingere che ci siano reindirizzamenti vincolanti".
Se abbiamo A -> C (v2. 1) e B -> C (v2.2) perché non trattare le dipendenze di A e B come le proprie busines S? (Perché CLR ecc ...) ma ancora perché CLR sta forzando un simile vincolo? Grazie! –
Il CLR non ha questo vincolo. Hai due file denominati C.dll, c'è solo un posto dove puoi metterli in modo che non si sovrascrivano l'un l'altro. Non usarlo –
Qui mi manca la conoscenza, ma perché C deve essere esposto a partire da A, e B. A e B devono essere dll indipendenti/autonomi. (Non sto discutendo voglio solo capire meglio il "perché"). Grazie per la vostra pazienza –