ASP.NET DLL ад

У меня есть стороннее программное обеспечение рабочего процесса (Captaris Teamplate), которое ссылается на сборку из моего проекта, которая ссылается на другие сборки из нашего проектного решения по всему GAC.

Когда наше приложение выполняется, оно вызывает метод Captaris Teamplate для создания процесса рабочего процесса, который, в свою очередь, использует сборки проекта в GAC для хранения данных в базе данных.

Проблема в том, что когда я компилирую свой проект и удаляю сборки из GAC, заменяя их новыми версиями, но когда я запускаю весь проект, Captaris Teamplate выдает ошибку:

Тип исключения: System.IO.FileNotFoundException
Сообщение. Имя файла или сборки VBAssembly или одна из его зависимостей не найдены.
FileName: VBAssembly
FusionLog: === Предварительно связать информацию о состоянии ===
LOG: DisplayName = VBAssembly, версия =0.0.0.0, культура = нейтральная, PublicKeyToken= ноль

То есть он не дал бы мне имя файла DLL сборки. Он пытается найти версию, которую ищет. Устранение неполадок, связанных с такой проблемой, подобно стрельбе в темноте и может привести к потере нескольких дней удаления старых сборок, которые хранятся в папке временных файлов ASP.NET, папке проекта и папке веб-сайта (inetpub), перезагрузке и т. Д., Проверке на наличие ошибок, получение ошибки, поиск других старых сборок и т. д.

Итак, мои вопросы:

  1. Есть ли метод, который позволил бы мне извлечь больше информации об этом исключении, например, имя сборки и версия, которая отсутствует?
  2. Есть ли простой способ удалить все эти старые версии сборок из системы во время компиляции?
  3. Любые другие предложения по работе с этой DLL Hell и / или Captaris Teamplate?

Мы используем ASP.NET версии 1.1 с Visual Studio 2003 с Captaris Workflow 5.0.

7 ответов

Если это вообще возможно, избегайте GAC. Он поддается DLL Ад. VBAssembly может фактически быть неуправляемой и может быть удалена из WINDOWS/system32 каталог.

Используйте Dependency Walker, чтобы узнать, что отсутствует зависимость.

Или вы можете использовать .NET Reflector.

Однако вы также можете просто позвонить продавцу и попросить помощи у него. В большинстве случаев эти ребята очень гордятся своими продуктами, поэтому они потратят время, чтобы рассказать вам о вашей проблеме по электронной почте или в чате. Я только что столкнулся с подобной проблемой со сторонним компонентом электронных таблиц, который я использовал, и хотя компания находилась в Германии, я смог решить проблему довольно быстро, заставив их перекомпилировать компонент на своем конце и когда они отправили мне новая DLL работала просто отлично.

Возможно, вы сможете создать политику привязки, которая перенаправит любой запрос на сборку, удаленную из XXX, в GAC на новое место. См. Обязательная политика.

Наверное, самый эффективный способ - бежать FusLogVW.exe (часть пакета.NET Framework SDK, см. Просмотр журнала привязки сборки (Fuslogvw.exe)), который будет регистрировать каждый сбой привязки, который происходит. Таким образом, вы можете перечислить неудачные попытки связывания из вашего приложения.

Еще одна вещь, которую вы можете сделать, это "принудительно" ссылаться на нужную версию сборки через web.config. Вот пример того, что у меня есть в моем файле web.config, чтобы убедиться, что у меня есть доступ к нужной версии Crystal Reports в моем веб-приложении...

<assemblies>       
   <add assembly="CrystalDecisions.Web, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
   <add assembly="CrystalDecisions.Shared, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
   <add assembly="CrystalDecisions.ReportSource, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
   <add assembly="CrystalDecisions.Enterprise.Framework, Version=11.5.3300.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>            
</assemblies>

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

Отправной точкой является попытка использовать параметр "Чистое решение", а затем создать решение.

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