Domanda System.IO.FileLoadException durante la firma dell'applicazione


Ho un'applicazione WPF che segue il pattern MVVM. Di recente abbiamo firmato l'app e ora sto ricevendo un sacco di eccezioni per la prima volta all'avvio. Ho rintracciato il problema al seguente:

In qualsiasi vista, se faccio riferimento a un altro spazio dei nomi con nell'applicazione quando viene inizializzata la vista, ottengo l'errore:

"Could not load file or assembly 'MyApplication, Version=3.0.5917.24348, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"MyApplication, Version=3.0.5917.24348, Culture=neutral, PublicKeyToken=xxxxxxxxxxx"

È sempre alla ricerca di una versione che è 1 dietro la versione che sto attualmente eseguendo.

Se rimuovo i riferimenti agli altri spazi dei nomi dalle viste, il InitializeComponent() non lancia l'errore

Vista:

<UserControl x:Class="MyApplication.View.DiagnosticsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:convert="clr-namespace:MyApplication.Converters"  <!--Causes error-->
             xmlns:behave="clr-namespace:MyApplication.Behaviors" <!--Causes error-->
             xmlns:controls="clr-namespace:MyApplication.UserControls"  <!--Causes error-->

Se rimuovo questi riferimenti e trasferisco i miei convertitori e comportamenti in un'altra DLL e quindi li riferimento tramite la DLL, non ci sono problemi. Gli errori vanno via. Anche se non firmo l'applicazione non ottengo gli errori. Non voglio davvero fare riferimento a queste cose in una DLL diversa, sembra che questo dovrebbe funzionare bene. Passa anche circa 30 secondi a lanciare tutti questi errori mentre vengono create tutte le visualizzazioni, quindi sto prendendo un colpo sulle prestazioni. Non capisco perché l'applicazione sta cercando di caricarsi, e perché sta cercando di caricare una versione precedente di se stessa. Non importa quante volte costruisco, l'errore è sempre 1 versione indietro.

Log di Fusion:

*** Assembly Binder Log Entry  (3/17/2016 @ 10:30:11 AM) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\tfs\Development\dev-feature\src\MyApplication\bin\Debug\MyApplication.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = MyApplication, Version=3.0.5920.15594, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx
 (Fully-specified)
LOG: Appbase = file:///C:/tfs/Development/dev-feature/src/MyApplication/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = MyApplication.exe
Calling assembly : PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\tfs\Development\dev-feature\src\MyApplication\bin\Debug\MyApplication.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: MyApplication, Version=3.0.5920.15594, Culture=neutral, PublicKeyToken=7b0591cb18d2a932
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/tfs/Development/dev-feature/src/MyApplication/bin/Debug/MyApplication.DLL.
LOG: Attempting download of new URL file:///C:/tfs/Development/dev-feature/src/MyApplication/bin/Debug/MyApplication/MyApplication.DLL.
LOG: Attempting download of new URL file:///C:/tfs/Development/dev-feature/src/MyApplication/bin/Debug/bin/MyApplication.DLL.
LOG: Attempting download of new URL file:///C:/tfs/Development/dev-feature/src/MyApplication/bin/Debug/bin/MyApplication/MyApplication.DLL.
LOG: Attempting download of new URL file:///C:/tfs/Development/dev-feature/src/MyApplication/bin/Debug/MyApplication.EXE.
LOG: Assembly download was successful. Attempting setup of file: C:\tfs\Development\dev-feature\src\MyApplication\bin\Debug\MyApplication.exe
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: MyApplication, Version=3.0.5920.15596, Culture=neutral, PublicKeyToken=7b0591cb18d2a932
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

12
2018-03-14 18:45


origine


risposte:


Modificare:

Hai usato ProcessMonitor per vedere dove Visual Studio sta caricando v 3.0.5917.24348 a partire dal? Visual Studio vuole v3.0.5920.15596 quindi devi mettere quella DLL dove è prevista.

Modifica 2:

Puoi inserire un reindirizzamento vincolante nel tuo file di configurazione come questo?

<dependentAssembly>
 <assemblyIdentity name="xxxxxx" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="3.0.5920.15596" newVersion="3.0.5917.24348"/>
</dependentAssembly>

Rif: . Assegnazione errata della versione di riferimento

Originale:

Una ragione per cui potresti ricevere l'errore:

Impossibile caricare il file o l'assembly "MyApplication, Version = 3.0.5917.24348, Culture = neutral, PublicKeyToken = xxxxxxxxxxxx" o una delle sue dipendenze. La definizione manifest di assembly individuato non corrisponde al riferimento all'assembly.

È quando il tuo assembly è firmato e il tuo riferimento ad esso ha la proprietà Versione specifica impostata su True, risultante in FileLoadException.

Verifica che la versione specifica sia impostata su False:

enter image description here


1
2018-03-17 00:03



È possibile che tu stia cercando di usarlo riferimenti URI con nome sicuro nel tuo XAML? Ad esempio, impostando il AssemblyPublicKeyToken attribuisci il tuo file di progetto o modificando il code-behind generato per XAML?

Se i tuoi riferimenti XAML utilizzano un nome sicuro e si utilizza una versione in continua evoluzione, quindi il tuo XAML potrebbe finire per utilizzare la versione precedente del progetto, perché i riferimenti sono generati precedente al completamento della compilazione (e alla nuova versione impostata).

Per controllare, trova il tuo generato per il tuo XAML sotto il obj directory e controllare Uris (ad esempio ~\obj\Debug\TestControl.g.i.cs):

System.Uri resourceLocater = new System.Uri("/T_Signing;V1.0.0.0;76005ee8ffcf5f2d;component/testcontrol.xaml", System.UriKind.Relative);

Sopra l'URI ha il nome completo e la versione. Considerando che se non si dispone di riferimenti con un nome forte, l'uri sarebbe più simile a:

System.Uri resourceLocater = new System.Uri("/T_Signing;component/testcontrol.xaml", System.UriKind.Relative);

0
2018-03-16 21:24