Обновление приложения с новой.net DLL дает мне FileLoadException?
У меня есть приложение.net 3.5 со многими dll, я пытался перестроить определенную dll без сборки всего приложения, но после замены старого на новое, приложение выдает исключение, так как не может загрузить новое исключение dll: System.IO.FileLoadException: не удалось загрузить файл или сборку.... Я так понимаю, что выполняется поиск сборки с определенной версией и общедоступным токеном. Как решить эту проблему, не создавая приложение снова? также заявка подписана, но не зарегистрирована в GAC. PS: Как я могу пропустить сборку приложения снова, или это необходимо, поскольку dll перестраивается?
5 ответов
Причина, по которой вы получаете ошибку, заключается в том, что ваша сборка подписана, и, скорее всего, ваша ссылка на нее имеет свойство "Конкретная версия", установленное в "Истина", и номер вашей версии сборки, в которую вы внесли изменение, изменился. Я перепробовал много сценариев, и это был единственный сценарий, в котором я смог получить исключение FileLoadException. Если вы изменили Target Framework на более новую версию, например 4.0, вы получите вместо этого BadImageFormatException. Даже если вы говорите, что не меняли номер версии, все равно отметьте его или установите для параметра "Определенная версия" значение "Ложь", выбрав ссылку и щелкнув правой кнопкой мыши и выбрав свойства.
Ваше исключение скорее всего выглядело так:
Could not load file or assembly 'LoadedAssembly, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=889080b75eb3bad2' or one of its dependencies. The located assembly's manifest
definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Но ваша скомпилированная версия, если сборка, на которую ссылаются, больше не является 1.0.0.0 (или любой другой версией, например). На изображении ниже (немного меньше) вы можете видеть, что эталонное свойство ищет версию 1.0.0.0, для Specific Version установлено значение True, а эталонная сборка подписана и фактически является версией 2.0.0.0, что приводит к исключению FileLoadException.
Чтобы решить эту проблему, измените номер версии обратно и перекомпилируйте или установите для параметра Specific Version значение False и перестройте только эту DLL. Вам не нужно перестраивать все ваше приложение.
Вы пытались использовать переменную окружения DEVPATH? Эта переменная среды позволяет вам определить каталог, который будет действовать как "GAC во время разработки". Все, что вам нужно сделать, это:
1) Добавьте следующий элемент в ваш machine.config (дважды проверьте, где будет использоваться ваш machine.config)
- C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIG OR
C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG *
2) Добавьте новую переменную среды с именем DEVPATH
set devpath="e:\temp\Message_DLL\bin\Debug" /// manually, console
/// or open windows config form - see below
3) После этого перейдите в приложение / проект пользовательского интерфейса и добавьте ссылку на свою dll в каталоге DEVPATH.
Убедитесь, что вы настроили "локальная копия = ложь, конкретная версия = ложь". Как вы могли заметить, Сильное имя (Starker Name) - это правда.
4) Теперь вы должны скомпилировать приложение UI РАЗ! После этого вы можете изменить свой источник в вашей DLL по своему усмотрению. Из-за переменной DEVPATH ваше пользовательское приложение всегда будет выбирать последнюю сборку вашей DLL!
НОТА! Я попытался запустить приложение пользовательского интерфейса из VS, но не удалось с исключением нагрузки. НО запуск из окна проводника - успешно. Похоже, что запуск приложения пользовательского интерфейса из VS заставляет CLR искать в указанном месте упомянутую DLL.
Также вы можете взглянуть на MSDN и MSDN2.
Примечания: Используйте этот параметр только во время разработки. Среда выполнения не проверяет версии в сборках со строгими именами, найденных в DEVPATH. Он просто использует первую найденную сборку.
Вы также можете просмотреть следующие статьи / веб-страницы.
CodeProject - расположение сборки, привязка, развертывание
Социальные MSDN Вопросы о DEVPATH
Я думаю, что это должно сработать!
Вы должны восстановить эти сборки, ссылающиеся на эту новую DLL.
Дикая догадка... можете ли вы проверить, помечена ли папка, в которой находится DLL, только для чтения.
Щелкните правой кнопкой мыши папку> Свойства> снимите флажок ReadOnly > нажмите "Применить"> выберите все подпапки и файлы> "ОК".
Восстановите ваше решение.
Windows EventLog должен предоставить больше информации о том, что не может быть загружено. Вы ввели новую зависимость в новую DLL? Я сталкивался с чем-то похожим, когда сторонняя DLL требовала установки C++ Runtime 2005 (что имеет место на большинстве Dev-машин, а также на большинстве настольных компьютеров, так как это очень распространено).