Исключение FileLoadException в InitializeComponent или x: Class=

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

Это сообщение об ошибке:

Не удалось загрузить файл или сборку 'Company.Solution.UserInterface, Version = 0.1.5568.25577, Culture = neutral, 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.

Ответ 1

   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. Не редкость на серверах сборки с функциями "непрерывной интеграции".

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

Ответ 2

Предложение 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 проекта ссылаются на одну и ту же версию этой сборки?