2015-03-31 4 views
12

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

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

Не удалось загрузить файл или сборку 'Company.Solution.UserInterface, Version = 0.1.5568.25577, Culture = нейтрально, 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 Окончательные и проект построен на .net4.5 и версии сборок сгенерировано автоматически в процессе сборки. Я загрузил журнал сборки to tinyupload, поскольку он был слишком большой. Полный журнал Fusion можно найти here at pastebin.

+0

Вы проверили свой журнал Fusion? –

+1

Является ли ссылка UserInterface.dll ссылкой только на один проект? – tchrikch

+0

Нет UserInterface используется тремя проектами, которые затем все объединены корнем зависимости. Я могу опубликовать график зависимостей, если это помогает – Console

ответ

1

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

Есть ли циклическая ссылка вызывает старую версию библиотеки DLL для загрузки? (это было доказано не в том смысле, но я остался по историческим причинам). Relating to this answer

Предложение 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> 

Explained in further detail here

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

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

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

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

+0

У меня нет циклических ссылок, циклическая ссылка не сработает, а мое приложение работает как ожидалось, это просто ужасно медленно при создании UserControls/Pages – Console

+0

@ Консоль Это может быть необязательно циклическая ссылка, но из сообщения об ошибке похоже, что вы загружаете версию, которая не соответствует ожидаемому проекту. Если вы проверите свою ссылку в VS, у нее есть конкретная версия, установленная на True? – Bijington

+0

@ Консоль не работает, если вы попытались настроить политику издателя? https://msdn.microsoft.com/en-us/library/dz32563a(v=VS.90).aspx – Bijington

7

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

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

Это должно быть не, проект должен быть построен только один раз в одном сеансе сборки. Узнав, почему это произошло, необходимо прорыть трассировку MSBuild. Вы создаете тот, который вам нужен, с помощью инструментов + Опции, проектов и решений, сборки и запуска. Измените параметр «Объём вывода сборки проекта MSBuild» на «Подробно». MSBuild теперь становится очень разговорчивым и рассказывает, почему он решил создать проект. Если вы заблудились в лесу, пытаясь декодировать его выход (его много), скопируйте его в паштет и вставьте ссылку на него в свой вопрос.

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

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

+0

Я просмотрел журнал MSBuild, но не смог найти ничего, что указывало бы на проблему. проект только получил сборку один раз. Ссылки всех других проектов на UserInterface.dll показывают ту же версию. – Console

+0

Номер версии очень сильно намекает, что вы что-то пропускаете. Вам нужно придумать способ, чтобы эта сборка была построена дважды в течение 2 секунд на вашем компьютере. Похоже, что попытка сборки + сборки дважды в течение 2 секунд технически возможна. Если вы не показываете нам что-то *, то просто нет никаких указаний. Как это построить след. –

+0

Я добавил след построения к моему вопросу. – Console