2016-03-14 12 views
12

Mam aplikację WPF, która jest zgodna ze wzorcem MVVM. Niedawno podpisaliśmy aplikację i teraz otrzymuję wiele wyjątków od pierwszej szansy przy starcie. Mam prześledzić problem do:System.IO.FileLoadException podczas składania aplikacji

W każdym razie, jeśli odwołać innej przestrzeni nazw ze we wniosku, gdy widok jest zainicjowany pojawia się błąd:

"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" 

Jego zawsze szuka wersji, która jest 1 za wersją, którą faktycznie uruchomiłem.

Gdybym usunięcie odniesień do innych nazw od poglądów, InitializeComponent() nie wyrzuca błędu

Widok:

<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--> 

Jeśli mogę usunąć te odniesienia i przenieść moje konwertery i zachowań w inną bibliotekę DLL, a następnie odsyłając je do biblioteki DLL, nie ma problemu. Błędy znikną. Również jeśli nie podpiszę zgłoszenia, nie otrzymam błędów. Naprawdę nie chcę mieć odniesienia do tych rzeczy w innej bibliotece DLL, wydaje się, że to powinno działać dobrze. Spędza również około 30 sekund, rzucając wszystkie te błędy, ponieważ wszystkie widoki są tworzone, więc robię uderzenie na wydajność. Nie rozumiem, dlaczego aplikacja próbuje się załadować i dlaczego próbuje załadować starszą wersję samego siebie. Bez względu na to, ile razy buduję, błąd zawsze wynosi 1 wersję.

Fusion Log:

*** 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. 
+0

stwierdziliśmy, że jeśli ustawić dysk wersji we właściwościach aplikacyjnych, takich jak 3.0.0.0 i nie pojawia się błąd. Jednak gdy mam wersję 3.0. * Dostaję błędy. – user1336827

+0

Jak się podpiszesz? – FriendlyGuy

+0

Sprawdzam "Podpisz zestaw" pod zakładką podpisywania w projekcie -> właściwości, a następnie wybierając nasz plik klucza. – user1336827

Odpowiedz

0

Czy to możliwe, że starasz się używać strong-named URI references in your XAML? Na przykład, ustawiając AssemblyPublicKeyToken attribute your project file lub modyfikując wygenerowane opóźnienie kodu dla XAML?

Jeśli referencje XAML są przy użyciu silnego nazwę i użyć stale zmieniających się wersji, wówczas XAML może skończyć się przy użyciu poprzedniej wersji projektu, ponieważ odniesienia są generowane przed do kompilacji bycia zakończone (i ustawiana nowa wersja).

Aby sprawdzić, znajdź swój generowane dla XAML w katalogu obj i sprawdź URI (na przykład ~\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); 

Nad URI ma pełną nazwę i wersję. Natomiast jeśli nie mają silne nazwane referencje URI byłoby więcej takich jak:

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

System.Uri resourceLocater = new System.Uri ("/ MyApplication; component/view/system/systeminformationview.xaml", System.UriKind.Relative); jest tym, co mam, co oznacza, że ​​nie są silnie nazywane? Jak mogę to naprawić? – user1336827

+0

@ user1336827 w twoim przypadku silna nazwa byłaby zła. Fakt, że twoje odwołanie nie zawiera klucza publicznego, oznacza, że ​​powyższa odpowiedź może nie dotyczyć Ciebie. Czy wiesz, że jeśli projekt ma jakieś wstępne kroki? – FriendlyGuy

+0

brak wstępnych lub późniejszych zdarzeń kompilacji. Rozwiązanie ma 4 projekty, jednak projekt, o którym mowa, nie odnosi się do żadnego z pozostałych, ani też żaden z pozostałych nie odwołuje się do niego. Nie sądzę, że to by miało skutek. – user1336827

1

Edit:

użyłeś ProcessMonitor zobaczyć gdzie Visual Studio jest ładowanie v 3.0.5917. z? Visual Studio chce v3.0.5920. , więc musisz umieścić tę bibliotekę DLL tam, gdzie jej oczekiwano.

Edit 2:

Can you put in a binding redirect in your config file like this?

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

Ref: .Net picking wrong referenced assembly version

oryginalny:

Jednym z powodów może masz błąd:

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.

Po podpisaniu zestawu, a odwołanie do niego ma właściwość Wersja specjalna ustawiona na wartość Prawda, co powoduje wyjątek FileLoadException.

Sprawdź, czy masz odpowiednią wersję ustawiona na False:

enter image description here

+0

Nie mam odniesienia do projektu w projekcie ... MyApplication to działająca aplikacja. I narzeka, że ​​nie może się załadować, ponieważ wersja nie pasuje. – user1336827

+0

No cóż, warto było wspomnieć. –

+0

Czy możesz przesłać roztwór szkieletu na stronę tempsend.com, aby móc go odtworzyć? –

Powiązane problemy