ASP.NET с Delphi 2007 для .NET. Не удалось загрузить файл или сборку… Определение манифеста обнаруженной сборки не соответствует ссылке на сборку

Это головорез. Вот сделка.

При развертывании бета-копии приложения ASP.NET, созданного с помощью Delphi 2007 для .NET, на тестовом сервере я столкнулся со странной проблемой. Приложению не удалось запустить, потому что оно не могло загрузить правильную версию поставщика данных ADO.NET, который я использовал.

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

Первоначально я скомпилировал проект со сборкой поставщика данных .net, используемой как Copy Local, что должно было заставить Delphi использовать копию той версии сборки, которую я выбрал, когда добавил ее в папку References в диспетчере проектов. Фактически я выбрал сборку версии 9.10.2.0, и это версия сборки, которая отображается в каталоге bin вместе с приложением. Однако во время выполнения приложение пыталось выполнить привязку к более ранней версии той же сборки, 9.0.2.7.

(На самом деле эта проблема возникает независимо от того, использую ли я версию Copy Local для GAC, поэтому я не думаю, что это проблема.)

Исследуя эту проблему, я создал новый проект и добавил ссылку на сборку 9.10.2.0. Тем не менее, и утилита настройки .NET 2.0, и Reflector показали, что приложение скомпилировано со ссылкой на сборку 9.0.2.7.

Изучив GAC, я увидел, что обе версии 9.0.2.7 и 9.10.2.0 были зарегистрированы. Попытка удалить версию 9.0.2.7 не удалась, поскольку эта версия поставщика все еще ссылалась на сборку в GAC.

Зашел в реестр и вручную удалил все ссылки на провайдера 9.0.2.7. Затем я смог удалить его из GAC. Это ничего не изменило. Удаление сборки из существующего приложения и последующее добавление версии 9.10.2.0 обратно, а затем компиляция, по-прежнему приводили к вставке неправильной информации о сборке в приложение. Как и раньше, создание нового приложения, ссылающегося на сборку 9.10.2.0, не помогло, поскольку ссылка на 9.0.2.7 все еще вставлялась в исполняемый файл.

Я проверил путь поиска библиотеки Delphi. Я также полностью удалил все экземпляры старых файлов сборки с машины (в том числе из каталога временных файлов ASP.NET). У меня все еще проблема. Я попытался использовать служебную программу Иссама Али AppManifest, чтобы вручную настроить манифест, но, очевидно, она не поддерживает приложения ASP.NET в Delphi 2007 для .NET.

Итак, GAC больше не содержит ссылок на 9.0.2.7, нет ссылок на него в реестре, нет путей к старому каталогу провайдера в проекте или диалогах опций Delphi, старая сборка провайдера отсутствует в файловой системе , и 9.0.2.7 не отображается ни в одном из файлов проекта. Он также не отображается в web.config, machine.config или в любом другом файле, который я проверял. Тем не менее, Delphi настаивает на использовании этой версии сборки каждый раз, когда я ссылаюсь на версию сборки 9.10.2.0. (Да, я перезапустил Delphi, а также перезапустил виртуальную машину, на которой выполнялась эта разработка.)

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

Я пробовал другие решения (о которых стоит упомянуть здесь), но ни одно из них не помогло. Кто-нибудь видел это? Я собираюсь продолжить работу над этой проблемой, но мне бы хотелось услышать предложения. Я просто не могу заставить Delphi перестать вставлять старую информацию о сборке в проект.

Для ухмылки я включаю журнал ошибок из-за сбоя. Этот журнал по сути дублирует информацию, которую я получаю из журнала слияния. Этот журнал взят из одного из простых приложений, которые я создал после удаления сборки 9.0.2.7 из GAC. Обратите внимание, что он с самого начала ищет старую версию провайдера.

Диспетчер сборки загружается из: c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorwks.dll Запускается под исполняемым файлом c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_wp.exe --- Подробная ошибка журнал следует.

=== Информация о состоянии предварительной привязки === ЖУРНАЛ: Пользователь = TRAINING8A \ ЖУРНАЛ ASPNET: DisplayName = Advantage.Data.Provider, версия = 9.0.2.7, культура = нейтральный, PublicKeyToken = e33137c86a38dc06 (полностью задано) LOG: Appbase = файл: /// C: / Inetpub / wwwroot / TestAdsVer2 / LOG: Initial PrivatePath = C: \ Inetpub \ wwwroot \ TestAdsVer2 \ bin

Вызывающая сборка: TestAdsVer2, версия = 1.0.3572.17384, культура = нейтральная, PublicKeyToken = null.

ЖУРНАЛ: Эта привязка начинается в контексте загрузки по умолчанию. ЖУРНАЛ: использование файла конфигурации приложения: C: \ Inetpub \ wwwroot \ TestAdsVer2 \ web.config ЖУРНАЛ: использование файла конфигурации хоста: c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet.config ЖУРНАЛ: использование файла конфигурации компьютера из c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ config \ machine.config. ЖУРНАЛ: ссылка на пост-политику: Advantage.Data.Provider, Version = 9.0.2.7, Culture = нейтральный, PublicKeyToken = e33137c86a38dc06 LOG: Попытка загрузки нового файла URL: /// c: /WINDOWS/Microsoft.NET/Framework/v2 .0.50727 / Временные файлы ASP.NET / testadsver2 / 07545aea / 3d068a5 / Advantage.Data.Provider.DLL. ЖУРНАЛ: попытка загрузки нового файла URL: /// c: /WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files / testadsver2 / 07545aea / 3d068a5 / Advantage.Data.Provider / Advantage.Data.Provider .DLL. ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /Inetpub/wwwroot/TestAdsVer2/bin/Advantage.Data.Provider.DLL. WRN: сравнение имени сборки привело к несоответствию: Minor Version ERR: Не удалось завершить настройку сборки (hr = 0x80131040). Зондирование прекращено

Это длилось так долго, что комментарии, которые я добавил к ответу LanceSC, больше не отображаются. Но я считаю, что это интересный вопрос, который я хочу затронуть.

Вот два моих последних комментария к LanceSC

  1. Установка, демонстрирующая такое поведение, находится на виртуальной машине, которая больше не работает. Другой разработчик, которого я знаю, столкнулся с такой же проблемой. Решением было отказаться от установки. Я чувствую, что что-то в установщике конкретной версии этого поставщика данных .NET оставило какой-то странный артефакт, из-за которого возникла проблема. Этого не происходит ни с одной другой сборкой этого поставщика данных. Я больше не ищу ответа на этот вопрос.

  2. Слишком рано заговорил. Сегодня (5 марта 2010 г.) мой коллега обнаружил ту же ошибку в более ранней версии того же поставщика данных .NET (9.0.2.1). Сейчас он в том же положении, что и я. Он не может запустить свое приложение ни с одной версией поставщика данных, кроме старой. Эта сборка использовалась как локальная копия, а старой версии нет в gac. На его машине мы запустили MSBuild с опцией подробного описания. Сборка прошла нормально, без ошибок. Тем не менее, приложение компиляции не запустилось, так как не смогло найти старую версию провайдера.

Резюме

Мой коллега смирился с переустановкой Delphi 2007 (к счастью, он работал с виртуальной машиной, и у него была вторая виртуальная машина с Delphi 2007, в которой не был установлен провайдер данных .NET). Это тоже была моя тактика.

На данный момент я пришел к выводу, что эта проблема неразрешима. Тем не менее, я оставляю этот вопрос открытым еще на неделю или около того. Если в ближайшие несколько недель не будет предложено никакого реального решения, я закрою этот вопрос.

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


person Cary Jensen    schedule 12.10.2009    source источник
comment
Вот еще одна часть головоломки, но она никоим образом не решающая. Я произвел чистую установку операционной системы и RAD Studio 2007. Я установил версию поставщика данных 9.10.2.0 (никогда не устанавливал версию 9.0.2.7). Затем я получил весь проект из системы управления версиями. Эта версия работает нормально и не запрашивает у провайдера версию 9.0.2.7. Другими словами, не похоже, что запрос старого поставщика каким-либо образом встроен в исходные файлы проекта.   -  person Cary Jensen    schedule 22.11.2009


Ответы (3)


Delphi 2007 использует MSBuild для выполнения фактических сборок; однако код в их продукте, который синхронизирует изменения между IDE и MSBuild, очень хрупкий. Я подозреваю, что файлы сборки не синхронизированы с IDE. Простой способ обновить их:

Откройте редактор реестра, перейдите в

HKEY_LOCAL_MACHINE\SOFTWARE\Borland\BDS\5.0\Globals

Измените значение ForceEnvOptionsUpdate на 1.

Откройте RAD Studio IDE.

Чтобы подтвердить мои подозрения, вам необходимо найти файлы, которые Delphi.NET передает в MSBuild. Они находятся где-то под профилем текущего пользователя. Вы также можете посмотреть параметры в справке Delphi, чтобы получить подробный вывод MSBuild.

person LanceSc    schedule 16.11.2009
comment
Спасибо за предложение. Я посмотрю и сообщу о том, что обнаружил. - person Cary Jensen; 19.11.2009
comment
Я просмотрел реестр и обнаружил, что ключ ForceEnvOptionsUpdate отсутствует. Я добавил этот ключ с 1 строковым значением (в readme.txt 2007 года упоминается, что это строковое значение). Это все еще не имело никакого эффекта. Я предполагаю, что MSBuild использует файл dproj. Я не нашел там ссылки, которая должна была повлиять. Я также искал все файлы в каталоге .NET framework, каталоге проекта и каталогах RAD Studio 5.0, а также каталогах Documents and Settings для 9.0.2.7, но безуспешно. Я включил в этот поиск скрытые и системные файлы. Все еще чешу в затылке. - person Cary Jensen; 21.11.2009
comment
Кстати, я поискал 9.0.2.7 на всем жестком диске. Поиск нашел несколько совпадений. Все они были связаны либо с кешированными сообщениями об ошибках, либо с журналами слияния (например, с тем, который я показал в исходном вопросе), а также с резервной копией реестра, которую я сделал перед удалением всех оставшихся остатков поставщика 9.0.2.7. - person Cary Jensen; 22.11.2009
comment
Похоже, вам нужно будет попробовать отладить задачу MSBuild, которая выполняется в фоновом режиме. Самый простой способ сделать это: откройте командную строку RAD Studio, перейдите в папку с вашим проектом и выполните следующую команду msbuild / verboisty: диагностика ›log.out Затем вам нужно будет просмотреть log.out, чтобы узнать, где он находится. сборка из. - person LanceSc; 23.11.2009
comment
Спасибо за это предложение. Я сейчас по уши в другом проекте и сделаю это, как только выйду на воздух. Кстати, я могу скопировать все файлы проекта на другую виртуальную машину, на которой никогда не был установлен файл 9.0.2.7, и все работает нормально. Итак, похоже, дело не в том, что что-то валяется в файлах проекта. - person Cary Jensen; 05.12.2009
comment
Установка, демонстрирующая такое поведение, находится на виртуальной машине, которая больше не работает. Другой разработчик, которого я знаю, столкнулся с такой же проблемой. Решением было отказаться от установки. Я чувствую, что что-то в установщике конкретной версии этого поставщика данных .NET оставило какой-то странный артефакт, из-за которого возникла проблема. Этого не происходит ни с одной другой сборкой этого поставщика данных. Я больше не ищу ответа на этот вопрос. - person Cary Jensen; 02.03.2010
comment
Слишком рано заговорил. Сегодня мой коллега столкнулся с той же ошибкой в ​​более ранней версии того же поставщика данных .NET (9.0.2.1). Сейчас он в том же положении, что и я. Он не может запустить свое приложение ни с одной версией поставщика данных, кроме старой. Эта сборка использовалась как локальная копия, а старой версии нет в gac. На его машине мы запустили MSBuild с опцией подробного описания. Сборка прошла нормально, без ошибок. Тем не менее, приложение компиляции не запустилось, так как не смогло найти старую версию провайдера. - person Cary Jensen; 05.03.2010

Вы пробовали использовать grep для каталогов инфраструктуры Delphi и .NET для 9.0.2.7, чтобы узнать, есть ли он где-нибудь в файле конфигурации?

Что-то типа:

grep -d 9\.0\.2\.7 *.xml

Другие места для поиска:

  • найдите в файлах проекта 9.0.2.7
  • поиск в реестре для 9.0.2.7 и поиск с использованием общедоступного токена
  • Если это приложение использует BDP, вы также можете выполнить поиск в файлах конфигурации BDP.
person Jeremy Mullin    schedule 12.10.2009
comment
Я искал все, что мог придумать. Нигде не могу найти 9.0.2.7 (по крайней мере, больше). - person Cary Jensen; 12.10.2009
comment
Вы смотрели файл project.dproj? Я создал приложение delphi для .net asp.net и нашел указанную информацию о сборке в моем файле project.dproj. - person Jeremy Mullin; 12.10.2009
comment
Да, я сделал. Единственные ссылки там указывают на каталог, в котором находится версия сборки 9.10.2.0. (Сборка версии 9.0.2.7 при установке оказалась в другой папке, чем версия 9.10.2.0.) - person Cary Jensen; 12.10.2009

Я столкнулся с чем-то очень похожим на это, и это заставляло меня буквально взбираться на стену в течение нескольких дней. У меня была ссылка на Oracle.DataAccess.dll, которая решительно застряла, указывая на старую версию, независимо от того, что было в GAC, в пути поиска и т. Д. Никакие перезапуски модификаций файлов .dproj никогда не сработают.

В конце концов я обнаружил, что оскорбительным элементом, который держался за старую ссылку, был сгенерированный Oracle.DataAccess.dcpil в каталоге C: \ Users \ Public \ documents \ rad studio \ 5.0 \ dcp.

Ему было больше года - в любом случае Delphi не хотела писать поверх него.

После того, как я удалил его, Delphi весело создала еще один, и, конечно же, теперь он указывает на сборку, которую я хочу.

Ух, обидно!

person Ritchie annand    schedule 26.03.2011
comment
Хм. Это интересное предложение. Я почти уверен, что удалил почти все и все, что мне не нужно, и я почти уверен, что удалил все файлы dcpil, даже те, которые находятся в общих папках. Я не смотрел на эту виртуальную машину больше года и не видел этой проблемы, кроме одной конкретной версии Advantage .NET Data Provider. Я предполагаю, что проблема была связана с чем-то необычным с этой конкретной версией драйвера. - person Cary Jensen; 27.03.2011
comment
Это вполне могло быть. На самом деле я наткнулся на вашу публикацию здесь в самом начале, когда пытался решить мою проблему. Эффекты были очень похожи: что бы я ни делал, мне нужна была более старая версия библиотеки. Я помню, как подумал, Господи, если Кэри Дженсен не может решить эту проблему, я облажался. Во всяком случае, надеюсь, если кто-то облажается ошибочным файлом в каталоге Dcp, он найдет это, используя те же условия поиска, которые я использовал для поиска здесь :) - person Ritchie annand; 29.04.2011