Подтвердить что ты не робот

System.IO.FileLoadException при подписании приложения

У меня есть приложение WPF, которое следует за шаблоном MVVM. Мы недавно подписали приложение, и теперь я получаю много исключений при первом запуске при запуске. Я проследил проблему следующим образом:

В любом представлении, если я ссылаюсь на другое пространство имен в приложении при инициализации представления, я получаю ошибку:

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

Он всегда ищет версию, которая стоит за версией, которую я фактически запускаю.

Если я удаляю ссылки на другие пространства имен из представлений, InitializeComponent() не выдает ошибку

Вид:

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

Если я удалю эти ссылки и перенеси мои конвертеры и поведение в другую DLL, а затем ссылаюсь на них через DLL, проблем нет. Ошибки уходят. Также, если я не подписываю приложение, я не получаю ошибок. Я действительно не хочу ссылаться на эти вещи в другой DLL, кажется, что это должно работать нормально. Он также тратит около 30 секунд, бросая все эти ошибки, поскольку все представления создаются, поэтому я получаю удар по производительности. Я не понимаю, почему приложение пытается загрузить себя, и почему оно пытается загрузить более старую версию. Независимо от того, сколько раз я строю, ошибка всегда 1 версия позади.

Журнал 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.
4b9b3361

Ответ 1

Edit:

Вы использовали ProcessMonitor, чтобы узнать, где загружается Visual Studio v 3.0.5917.24348? Visual Studio хочет v3.0.5920.15596, поэтому вам нужно поставить ту DLL, где ее ожидали.

Изменить 2:

Можете ли вы поместить перенаправление привязки в свой файл конфигурации следующим образом?

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

Ссылка: .Net выбор неправильной ссылочной версии сборки

Оригинал:

Одна из причин, по которой вы можете получить ошибку:

Не удалось загрузить файл или сборку 'MyApplication, Version = 3.0.5917.24348, Culture = neutral, PublicKeyToken = xxxxxxxxxxxx' или одну из его зависимостей. Расположенное определение манифеста сборки не соответствует ссылке на сборку.

Когда ваша сборка подписана и ваша ссылка на нее имеет свойство Specific Version, равное True, в результате возникает исключение FileLoadException.

Убедитесь, что для определенной версии установлено значение False:

введите описание изображения здесь

Ответ 2

Возможно ли, что вы пытаетесь использовать ссылки на URI с сильным именем в вашем XAML? Например, установив атрибут AssemblyPublicKeyToken вашего файла проекта или изменив сгенерированный код для XAML?

Если ваши ссылки XAML используют сильное имя, и вы используете постоянно меняющуюся версию, тогда ваш XAML может закончиться использованием предыдущей версии проекта, потому что ссылки создаются до завершения сборки (и новые версия установлена).

Чтобы проверить, найдите свой сгенерированный для XAML каталог obj и проверьте на Uris (например, ~\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);

Выше URI имеет полное имя и версию. Если у вас нет сильных названных ссылок, uri будет больше похож:

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