Как узнать, какая зависимость не загружается

#.net #asp.net

#.net #asp.net

Вопрос:

При попытке запустить веб-приложение я получаю следующую ошибку:

 Exception information: 
    Exception type: ConfigurationErrorsException 
    Exception message: Could not load file or assembly 'Atalasoft.dotImage.AdvancedDocClean.DLL' or one of its dependencies. The specified module could not be found.
  

Я работаю на Windows Server 2003 и .NET Framework 4.0. Те же двоичные файлы и библиотеки dll успешно выполняются на сервере Windows Server 2008 R2.

Как я могу узнать, какая зависимость не загружается?

Редактировать

Ведение журнала Fusion показывает следующее:

 *** Assembly Binder Log Entry  (4/11/2011 @ 2:37:42 PM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:WINDOWSMicrosoft.NETFrameworkv4.0.30319clr.dll
Running under executable  C:WINDOWSSysWOW64inetsrvw3wp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = NT AUTHORITYNETWORK SERVICE
LOG: DisplayName = Atalasoft.dotImage.AdvancedDocClean
 (Partial)
WRN: Partial binding information was supplied for an assembly:
WRN: Assembly Name: Atalasoft.dotImage.AdvancedDocClean | Domain ID: 4
WRN: A partial bind occurs when only part of the assembly display name is provided.
WRN: This might result in the binder loading an incorrect assembly.
WRN: It is recommended to provide a fully specified textual identity for the assembly,
WRN: that consists of the simple name, version, culture, and public key token.
WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue.
LOG: Appbase = file:///K:/App/Prd/SEMS/asp/sems/
LOG: Initial PrivatePath = K:AppPrdSEMSaspsemsbin
LOG: Dynamic Base = C:WINDOWSMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filessemscd484e8d
LOG: Cache Base = C:WINDOWSMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filessemscd484e8d
LOG: AppName = a29ce80f
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: K:AppPrdSEMSaspsemsweb.config
LOG: Using host configuration file: \?C:WINDOWSmicrosoft.netFrameworkv4.0.30319aspnet.config
LOG: Using machine configuration file from C:WINDOWSMicrosoft.NETFrameworkv4.0.30319configmachine.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:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/sems/cd484e8d/a29ce80f/Atalasoft.dotImage.AdvancedDocClean.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/sems/cd484e8d/a29ce80f/Atalasoft.dotImage.AdvancedDocClean/Atalasoft.dotImage.AdvancedDocClean.DLL.
LOG: Attempting download of new URL file:///K:/App/Prd/SEMS/asp/sems/bin/Atalasoft.dotImage.AdvancedDocClean.DLL.
LOG: Assembly download was successful. Attempting setup of file: K:AppPrdSEMSaspsemsbinAtalasoft.dotImage.AdvancedDocClean.dll
LOG: Entering download cache setup phase.
LOG: Assembly Name is: Atalasoft.dotImage.AdvancedDocClean, Version=9.0.2.43320, Culture=neutral, PublicKeyToken=2b02b46f7326f73b
LOG: A partially-specified assembly bind succeeded from the application directory. Need to re-apply policy.
LOG: Using application configuration file: K:AppPrdSEMSaspsemsweb.config
LOG: Using host configuration file: \?C:WINDOWSmicrosoft.netFrameworkv4.0.30319aspnet.config
LOG: Using machine configuration file from C:WINDOWSMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Post-policy reference: Atalasoft.dotImage.AdvancedDocClean, Version=9.0.2.43320, Culture=neutral, PublicKeyToken=2b02b46f7326f73b
LOG: GAC Lookup was unsuccessful.
LOG: Binding succeeds. Returns assembly from C:WINDOWSMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filessemscd484e8da29ce80fassemblydl363ae24d2b8096e5c_94f5cb01Atalasoft.dotImage.AdvancedDocClean.dll.
LOG: Assembly is loaded in default load context.
  

Редактировать

Вывод из CppCodeProvider, который не удалось загрузить

 *** Assembly Binder Log Entry  (4/11/2011 @ 2:37:42 PM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:WINDOWSMicrosoft.NETFrameworkv4.0.30319clr.dll
Running under executable  C:WINDOWSSysWOW64inetsrvw3wp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = NT AUTHORITYNETWORK SERVICE
LOG: DisplayName = CppCodeProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 (Fully-specified)
LOG: Appbase = file:///K:/App/Prd/SEMS/asp/sems/
LOG: Initial PrivatePath = K:AppPrdSEMSaspsemsbin
LOG: Dynamic Base = C:WINDOWSMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filessemscd484e8d
LOG: Cache Base = C:WINDOWSMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filessemscd484e8d
LOG: AppName = a29ce80f
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: K:AppPrdSEMSaspsemsweb.config
LOG: Using host configuration file: \?C:WINDOWSmicrosoft.netFrameworkv4.0.30319aspnet.config
LOG: Using machine configuration file from C:WINDOWSMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Post-policy reference: CppCodeProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/sems/cd484e8d/a29ce80f/CppCodeProvider.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/sems/cd484e8d/a29ce80f/CppCodeProvider/CppCodeProvider.DLL.
LOG: Attempting download of new URL file:///K:/App/Prd/SEMS/asp/sems/bin/CppCodeProvider.DLL.
LOG: Attempting download of new URL file:///K:/App/Prd/SEMS/asp/sems/bin/CppCodeProvider/CppCodeProvider.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/sems/cd484e8d/a29ce80f/CppCodeProvider.EXE.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/sems/cd484e8d/a29ce80f/CppCodeProvider/CppCodeProvider.EXE.
LOG: Attempting download of new URL file:///K:/App/Prd/SEMS/asp/sems/bin/CppCodeProvider.EXE.
LOG: Attempting download of new URL file:///K:/App/Prd/SEMS/asp/sems/bin/CppCodeProvider/CppCodeProvider.EXE.
LOG: All probing URLs attempted and failed.
  

Ответ №1:

Ну, зависимость, которая, похоже, отсутствует, это Atalasoft.dotImage.AdvancedDocClean.DLL . Когда вы запускаете это на компьютере 2008, знаете ли вы, откуда загружается эта DLL? У вас это локально развернуто в каталоге bin веб-приложения, или оно установлено где-то на этом компьютере, или установлено в GAC?

Еще одна вещь, которую следует проверить, это то, что вы используете одну и ту же версию .NET на обоих компьютерах. Если на компьютере 2008 года запущена .NET 4, а на компьютере 2003 года — нет, возможно, загружаются разные библиотеки DLL.

Полезным инструментом для отладки проблем с загрузкой сборки является Fusion. Ведение журнала Fusion поставляется с .NET, вам просто нужно включить его и использовать средство просмотра журналов Fusion:

http://msdn.microsoft.com/en-us/library/e74a18c4 (VS.71).aspx

Комментарии:

1. Спасибо. Я скопировал средство просмотра журналов Fusion со своего компьютера на сервер, запустил его на сервере, изменил настройку на запись всех привязок на диск, попробовал веб-приложение, и, похоже, ничего не регистрируется. Все DLL-файлы находятся в папке bin приложения на обоих серверах. На обоих серверах работает .NET 4.

2. Я забыл, но вам может потребоваться включить флаг в реестре, чтобы включить ведение журнала fusion. Я не делал этого некоторое время, поэтому я не помню, что именно вам нужно сделать.

3. Мне пришлось установить этот раздел реестра для ведения журнала — установите значение реестра HKLMSoftware MicrosoftFusionLogResourceBinds равным 1 (значение является DWORD).

4. Обнаружив сбой CppCodeProvider, я установил распространяемый Visual C 2010, и проблема была решена.

5. Не уверен, почему Atalasoft не сообщает вам, какие компоненты требуются для развертывания. Они должны предполагать, что все используют Visual C на своих серверах. 😉 Требуется среда выполнения C (2010 для .NET 4)

Ответ №2:

Я вижу много ссылок на http://msdn.microsoft.com/en-us/library/e74a18c4 (VS.71).aspx

Но помните, что это версия .NET 1.1, и она имеет ASP.NET переключатель. В новом журнале fusion у вас нет ASP.NET переключатель.

Я не видел документации о том, как использовать журнал слияния с ASP.NET. Изменение ключа реестра — это вариант, который я вижу повсюду, но есть ли какая-либо документация для версии 4.0?

Кто-нибудь знает?


ОБНОВЛЕНИЕ: я нашел решение здесь. Думаю, я не выдержал и начал работать с реестром.

HKEY_LOCAL_MACHINESOFTWAREMicrosoftFusion

Добавить:

DWORD ForceLog устанавливает значение в 1
DWORD LogFailures устанавливает значение в 1

DWORD LogResourceBinds устанавливает значение в 1

String LogPath задает значение для папки для журналов ie) C:FusionLog

Ответ №3:

Я предлагаю ознакомиться с документацией по журналам Fusion здесь

К сожалению, ошибка может указывать на проблему с зависимостями библиотеки dll, которую вы пытаетесь загрузить, и если ведение журнала включено, вы сможете точно увидеть, какая из них это. Обратите внимание, что зависимости, загруженной в загружаемое приложение, недостаточно для предоставления dll-доступа к ней во всех случаях (если они не используют один и тот же домен приложения). В какой-то момент у меня возникли некоторые проблемы с этим, когда я пытался создавать плагины с их собственным доменом приложения

Ответ №4:

Я думаю, это означает, что этой DLL нет в папке bin вашего приложения. Попробуйте взять DLL сборки и вручную поместить ее в эту папку.

Комментарии:

1. Я могу подтвердить, что dll находится в папке bin. Точная копия папки работает на сервере Windows 2008. Все сборки находятся в папке bin, а не в GAC