FileLoadException At InitializeComponent или x:Class=

Я получаю исключение загрузчика файлов (первый шанс) на InitializeComponent-метод или отладчик ломается на x:Class атрибут корня xaml нескольких пользовательских элементов управления WPF. Все работает нормально, несмотря на то, что исключения сильно тормозят навигацию.

Это сообщение об исключении:

Не удалось загрузить файл или сборку "Company.Solution.UserInterface, версия =0.1.5568.25577, культура = нейтральная, PublicKeyToken=45069ab0c15881ce" или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Это журнал Fusion:

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  D:\Development\Product\Main\src\Company.Product \bin\Debug\Product.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Company.Product .UserInterface, Version=0.1.5568.25577, Culture=neutral, PublicKeyToken=45069ab0c15881ce
(Fully-specified)
LOG: Appbase = file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/
LOG: Initial PrivatePath = NULL
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: D:\Development\Product \Main\src\Company.Product \bin\Debug\Product .vshost.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: Company.Product .UserInterface, Version=0.1.5568.25577, Culture=neutral, PublicKeyToken=45069ab0c15881ce
LOG: Attempting download of new URL file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/Company.Product.UserInterface.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Моя структура проекта имеет корневой проект, который ссылается на проект модуля (в котором происходит исключение). Сам проект модуля ссылается на проект, который является целью вышеупомянутого исследования "Company.Product.UserInterface.dll", который содержит некоторые ресурсы / элементы управления / стили / примитивы / конвертеры и так далее.

Как я могу избавиться от FileLoadExceptions?

Еще один более полный Fusion-журнал:

=== Pre-bind state information ===
LOG: DisplayName = Company.Product.UserInterface, Version=0.1.5577.18122,      Culture=neutral, PublicKeyToken=45069ab0c15881ce
(Fully-specified)
LOG: Appbase = file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = Product.vshost.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: D:\Development\Product\Main\src\Company.Product\bin\Debug\Product.vshost.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: Company.Product.UserInterface, Version=0.1.5577.18122, Culture=neutral, PublicKeyToken=45069ab0c15881ce
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/Company.Product.UserInterface.DLL.
LOG: Assembly download was successful. Attempting setup of file: D:\Development\Product\Main\src\Company.Product\bin\Debug\Company.Product.UserInterface.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Company.Product.UserInterface, Version=0.1.5577.18123, Culture=neutral, PublicKeyToken=45069ab0c15881ce
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.

В настоящее время возникает исключение, версия сборки в SolutionExplorer, на которую ссылаются, является 0.1.5577.18123 (во всех решениях, которые ссылаются на..UserInterface.dll. Я не знаю, кто ищет 0.1.5577.18122, эта версия никогда не существовала)

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

LOG: Post-policy reference: Company.Product.UserInterface, Version=0.1.5577.18465, Culture=neutral, PublicKeyToken=45069ab0c15881ce

найденная версия:

LOG: Assembly Name is: Company.Product.UserInterface, Version=0.1.5577.18466, Culture=neutral, PublicKeyToken=45069ab0c15881ce

Версия Visual Studio 2013 Ultimate, проект построен на.net4.5, а версии сборки автоматически генерируются в процессе сборки. Я загрузил журнал сборки в tinyupload, так как он был слишком большим. Полный журнал Fusion можно найти здесь на pastebin.

2 ответа

   Version=0.1.5577.18122

Этот автоматически сгенерированный номер версии говорит о том, что последние две части номера версии не являются произвольными. Они основаны на дате и времени сборки. Номер сборки генерируется из числа дней с 1 января 2000 года. Номер редакции - это количество секунд *2 с полуночи без коррекции перехода на летнее время.

Итак, мы знаем, что сборка 18122 была построена 30 марта в 2:12:34 во второй половине дня. И затем он был построен снова, через 2 секунды в 2:12:36 во второй половине дня. После того, как он был использован в качестве эталонной сборки для создания другого проекта, который сделал CLR плеваться пулями.

Этого не должно быть, проект должен быть собран только один раз за один сеанс сборки. Чтобы выяснить, почему это произошло, нужно изучить трассировку MSBuild. Вы создаете тот, который вам нужен, с помощью инструментов + параметров, проектов и решений, сборки и запуска. Измените настройку "Детализация сборки проекта MSBuild" на "Подробно". MSBuild теперь очень болтлив и рассказывает, почему решил построить проект. Если вы заблудились в лесу, пытаясь расшифровать его вывод (его много), скопируйте / вставьте его в корзину и вставьте ссылку на него в своем вопросе.

В остальном не так много хороших объяснений такой неудачи. В старых версиях VS было слишком легко случайно создать круговую зависимость между проектами. Вы очищаете это, используя Build + Clean. Перестроить решение теперь не удается и говорит вам, какая справочная сборка является источником проблем. Вы используете.NET 4, однако, по крайней мере, VS2010. Так что это не фантастическое преимущество, Microsoft добавила больше проверок, чтобы предотвратить это без предупреждения. Не уверен, что он надежен во всех случаях, его можно обмануть, если вы, например, не зависите от MSBuild. Не редкость на серверах сборки с функциями "непрерывной интеграции".

Нам нужна трассировка сборки, чтобы дать вам надежную диагностику.

Предложение 1

Есть ли циклическая ссылка, вызывающая загрузку старой версии dll? (доказано, что это не главное, но я ушел по историческим причинам). Относительно этого ответа

Предложение 2

Можете ли вы попробовать создать политику издателя? Вот пример, который нужно добавить в ваш файл app.config.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Company.Solution.UserInterface"
                        publicKeyToken="45069ab0c15881ce"
                        culture="en-us" />
      <!-- Redirecting to version 0.1.5568.25577 of the assembly. -->
      <bindingRedirect oldVersion="0.0.0.0-0.1.5568.25577"
                      newVersion="0.1.5568.25577"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Более подробно объяснено здесь

Предложение 3

Что-нибудь изменилось в отношении ключа, который используется для подписи ваших сборок?

Предложение 4

В качестве небольшой адаптации моего первоначального предложения. Вы заявили, что есть 3 проекта, которые ссылаются на Company.Solution.UserInterface. Можете ли вы подтвердить, что все 3 проекта ссылаются на одну и ту же версию этой сборки?

Другие вопросы по тегам