2013-07-18 10 views
3

Итак, я знаю, что было много вопросов, подобных этому, но за последние дни я пролил много ответов, и ничего не помогло.FileLoadException на загрузке DLL

Я разрабатываю приложение WPF, которое ссылается на кучу внешних DLL. В частности, есть одна DLL, называемая DefinitionInterpreter, которая, как оказалось, вызывает проблемы. В каждом проекте я ссылаюсь на него, он упрям ​​и предпочитает не работать. Мне удалось заставить его работать в моем модульном тестовом наборе, однако я не могу, стараюсь, как я могу, заставить его работать в моем приложении WPF.

Я пробовал GAC, очищаю свой проект, добавляя его и удаляя, перезагружая, проверяя версию, проверяя зависимости, и ничего не работает.

я получаю такое же исключение:

Не удалось загрузить файл или сборку 'DefinitionInterpreter, Version = 3.6.0.0, культура = нейтральной, PublicKeyToken = нуль' или один из его зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Я пробовал открывать DLL в ildasm.exe и ничего необычного не показывал. Это только зависимости System.Xml, System.Core и mscorlib.

Когда я проверяю манифест, он проверяет, что версия 3.6.0.0

Дело в том, что на самом деле получает меня является то, что он работает в одном из моих проектов, но я не могу заставить его работать в другом , хотя они ссылаются на одну и ту же DLL (тот же путь и все).

Любые предложения? Я использую .NET 4.0 (это требование к проекту, равное 4.0), и попробовал как x86, так и x64.

Edit:

После просмотра Fusion Вход детали, я получаю это как выход:

*** Assembly Binder Log Entry (7/18/2013 @ 7:07:42 PM) *** 

The operation failed. 
Bind result: hr = 0x80131040. No description available. 

Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 
Running under executable E:\Src\Hermes\Tool\bin\Debug\HermesClient.vshost.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: DisplayName = DefinitionInterpreter, Version=3.6.0.0, Culture=neutral, PublicKeyToken=null 
(Fully-specified) 
LOG: Appbase = file:///E:/Src/Hermes/Tool/bin/Debug/ 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = NULL 
LOG: AppName = HermesClient.vshost.exe 
Calling assembly : SomeAssembly, Version=13.5.13.0, Culture=neutral, PublicKeyToken=null. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: E:\Src\Hermes\Tool\bin\Debug\HermesClient.vshost.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///E:/Src/Hermes/Tool/bin/Debug/DefinitionInterpreter.DLL. 
LOG: Assembly download was successful. Attempting setup of file: E:\Src\Hermes\Tool\bin\Debug\DefinitionInterpreter.dll 
LOG: Entering run-from-source setup phase. 
LOG: Assembly Name is: DefinitionInterpreter, Version=3.6.0.0, Culture=neutral, PublicKeyToken=75a99a2a5bcd4c96 
WRN: Comparing the assembly name resulted in the mismatch: PUBLIC KEY TOKEN 
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. 

Ссылка в моем CSProj выглядит следующим образом:

<Reference Include="DefinitionInterpreter, Version=3.6.0.0, Culture=neutral, PublicKeyToken=75a99a2a5bcd4c96, processorArchitecture=MSIL"> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\..\..\..\DefinitionInterpreter.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 

Когда я выполняю команда sn -T DefinitionInterpreter.dll Я получаю 75a99a2a5bcd4c96. Я честно понимаю, что во время работы он считает, что токен открытого ключа равен нулю и почему существует несоответствие.

+4

Использование «Fusion Log Viewer», чтобы увидеть, где оно загрузилось в обоих случаях, может дать вам некоторые идеи о том, почему это происходит. При заданном объеме информации вряд ли будет дан ответ ... –

+0

@AlexeiLevenkov После игры с программой просмотра журнала Fusion я получил ее на работу, и, по-видимому, существует несогласованность открытого ключа по неизвестным причинам. –

+0

Журнал не соответствует сообщению об исключении, обязательно его обновите. Попробуйте удалить хотя бы один возможный режим сбоя, скопировав этот проект на ваш диск C :. –

ответ

2

Итак, из журнала это похоже на то, что «SomeAssembly» связано с неописанной версией этой DLL, но все локальные версии подписаны.

Если вы сами создаете «SomeAssembly» - проверьте, указывает ли ссылка на «DefinitionInterpreter» на подписанную версию, в противном случае дважды проверьте с ILDasm, что «SomeAssembly» действительно ссылается на не подписанную версию и просит владельца предоставить другую версию.

+0

Это оказалось прямо на отметке. Спасибо, Алексей. Оказывается, я использовал неправильную копию «SomeAssembly», которая немного устарела. –