System badimageformatexception не удалось загрузить файл или сборку
у меня есть два проекта, ProjectA и ProjectB . ProjectB есть консольное приложение, которое зависит от ProjectA . Вчера все работало нормально, но вдруг сегодня, когда я бегу ProjectB Я понимаю:
BadImageFormatException был необработанным:
Не удалось загрузить файл или сборку "ProjectA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" или одну из ее зависимостей. Была сделана попытка загрузить программу, имеющую неверный формат.
вещи, которые я пробовал:
- убедитесь, что оба проекта настроены на "любой процессор" с помощью построить проверено. Они.
- убедитесь, что оба проекта предназначены для одной цели Рамки (Профиль Клиента .Net 4.0).
- в разделе ProjectB --> ссылки --> ProjectA -- > свойства, убедитесь, что "Копировать Локально" установлено значение "правда" _ (я проверил этот проект.dll копируется правильно)
- очистить/перестроить решение. Я даже попытался вручную удалить папки /bin и /obj в обоих проектах.
- Перезапустите Visual Studio. Перезагрузить компьютер.
- проверить совершенно новая копия хранилища.
Я уверен, что у вас 32-разрядная / 64-разрядная конфликта. Похоже, что ваш основной проект может быть установлен в 32-разрядный, А класс, на который он ссылается, - в 64-разрядный. Попробуйте посмотреть на это так вопрос и и это тоже. Между ними двумя, Вы должны быть в состоянии понять свою проблему.
возможно, вы столкнулись с проблемой с вашим сайтом после развертывания на сервере.
затем вам нужно настроить пул приложений для включения 32-разрядных приложений.
- открыть Диспетчер IIS
- нажмите на пулы приложений
- выберите пул приложений, который вы используете
- на правой панели выберите Дополнительные параметры.
- Set включить 32-разрядные приложения для Правда
Инструменты - > Параметры - > проекты и решения - > веб-проекты
Установить флажок это говорит: "используйте 64-разрядную версию IIS Express для веб-сайтов и проекты."
У меня была такая же проблема. Я установил "цель платформы" проекта A ("проект A"(щелкните правой кнопкой мыши)->Свойства->сборка->" цель платформы") в x86, но сохранил проект B в"любом процессоре". Задание проекта " Б " на "x86" это исправил.
У меня была эта проблема с запуском модульных тестов (xunit) в Visual Studio 2015 и наткнулся на следующее исправление:
возможно, Вам придется изменить Приложение, Бассейн настройка "Enable 32bit Applications" на TRUE в IIS7, если у вас есть по крайней мере 1 32bit dll\exe в вашем проекте.
вы также можете увидеть эту проблему, если вы пытаетесь упаковать 64-битный проект с установщиком MSI в VS. ("Причина в том, что родная прокладка упакована с помощью .MSI-файл представляет собой 32-разрядный исполняемый файл.")
ни одно из этих решений не сработало для меня, но, удалив содержимое папок bin и obj, все снова стало круто.
Я получил это при создании проекта через Visual Studio Online (VSTS) Build с помощью Visual Studio Build действия.
- удалить существующую исходную папку
- явно установите "любой процессор" в платформе для всех сборок Visual Studio, включая зависимости (см. снимок экрана ниже).
- повторно запустите сборку
Я столкнулся с такой же проблемой. Он выскочил из ниоткуда, и это показалось мне странным.
все проекты имели целевой процессор AnyCPU. Я изменил проект приложения ( проект, который ссылается на все другие проекты) на целевой процессор x86. Теперь это работает.
Не уверен, как целевой процессор перепутался без видимой причины, но это произошло.
Я также сталкиваются с этой проблемой в проекте, через несколько минут я нашел решение, эта проблема связана с конфигурацией CPU, Если вы используете Visual Studio 2010 или VS 2013, just goto project ' s свойства и выберите Compile из боковой панели, и будет 5 выпадающих, 5-й выпадающий будет целевой процессор:, вы должны установить его на x86 или x64 согласно вашим требованиям вместо любого К. П. У.
моя проблема была решена после замены его на x86.
а также это срабатывает, когда у вас есть оба упомянутых фреймворка, доступных в вашей системе.
в качестве обходного пути вызовите целевую структуру, которую вы собираетесь использовать для отладки в приложение.config
установите все пакеты ниже
распространяемые пакеты Visual C++ для Visual Studio 2013-vcredist_x64
распространяемые пакеты Visual C++ для Visual Studio 2013-vcredist_x86
распространяемые пакеты Visual C++ для Visual Studio 2012-vcredist_x64
распространяемые пакеты Visual C++ для Visual Studio 2012-vcredist_x86
прежде всего, я получил это в VS2017 со старым проектом, который мне нужно было сделать крошечные изменение и upraded все проекты в рамках 4.7.
есть несколько мест, где вам нужно это сделать, и это может быть не так просто, как выбор из раскрывающегося списка. Это исправило его для меня:
1) вам нужно сделать это оба здесь:
2), а также в Configuration Manager (правой кнопкой мыши на решение)
но что, если его не существует.
нажмите кнопку New и выберите следующие настройки: ( спасибо @RckLN)
Это может быть немного смешно, но у меня была такая же проблема с обычным рабочим кодом. Я добавил StreamWriter и StreamReader, и это дало эту ошибку. Решение было в том, что я взял этот код в скобки комментариев, затем отладил, и он снова начал работать
У меня также была эта проблема с запуском модульных тестов с помощью ReSharper в Visual Studio 2017 и исправлена со следующей конфигурацией:
моя машина показала мне обновление BIOS, и я задался вопросом, связано ли это с внезапным появлением этой ошибки. И после того, как я сделал обновление, ошибка была решена, и решение построено нормально.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Исключение, которое выдается при недопустимом образе файла библиотеки динамической компоновки (DLL) или выполняемой программы.
Методы
Определяет, равен ли указанный объект текущему объекту.
При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений.
Служит хэш-функцией по умолчанию.
Задает для объекта SerializationInfo имя файла, журнал кэша сборок и дополнительные сведения об исключении.
При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении.
Возвращает тип среды выполнения текущего экземпляра.
Создает неполную копию текущего объекта Object.
События
Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
The exception that is thrown when the file image of a dynamic link library (DLL) or an executable program is invalid.
Конструкторы
Инициализирует новый экземпляр класса BadImageFormatException.
Инициализирует новый экземпляр класса BadImageFormatException с сериализованными данными.
22 Answers 22
Verified build settings such as Platform Target are all the same (x86).
That's not what the crash log says:
Note the 64 in the name, that's the home of the 64-bit version of the framework. Set the Target platform setting on your EXE project, not your class library project. The XxxDevicesService EXE project determines the bitness of the process.
After I stopped banging my head on the desk thinking of the entire week I spent running down this problem, I am sharing what worked for me. I have Win7 64 bit, 32-bit Oracle Client, and have my MVC 5 project set to run on x86 platform because of the Oracle bitness. I kept getting the same errors:
Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
I reloaded the NuGet packages, I used copies of the DLLs that worked for others in different apps, I set the codebase in the dependent assembly to point to my project's bin folder, I tried CopyLocal as true or false, I tried everything. Finally I had enough else done I wanted to check in my code, and as a new contractor I didn't have subversion set up. While looking for a way to hook it into VS, I tripped over the answer. What I found worked was unchecking the following:
Tools
-> Options
--> Projects and Solutions
---> Web Projects
----> Use the 64 bit version of IIS Express for web sites and projects
проблема существует как в Windows 7 64-разрядной (dev), так и в Windows XP SP3 32-разрядной (целевой) системный.
вот что я пробовал до сих пор:
- проверенные настройки сборки, такие как цель платформы, одинаковы (x86).
- используется peverify с параметром / verbose для обеспечения допустимости двоичных файлов сборки.
- использует fuslogvw для поиска любых проблем с загрузкой.
- используется CheckAsm для поиска отсутствующих файлов или assembiles.
все эти проверки ничего не изменится. Я включил полный текст информация об исключениях ниже, с некоторыми именами, измененными для защиты секретов моих корпоративных мастеров.
проверенные параметры сборки, такие как цель платформы, одинаковы (x86).
это не то, что говорит журнал сбоев:
Примечание 64 в названии, это дом 64-разрядной версии фреймворка. Установите настройку целевой платформы на свой exe-файла проект, а не проект библиотеки классов. Этот Проект EXE XxxDevicesService определяет битность процесса.
после того, как я перестал стучать головой о стол, думая о всей неделе, которую я провел, разбирая эту проблему, я делюсь тем, что сработало для меня. У меня есть 64-разрядный клиент Win7, 32-разрядный клиент Oracle и мой проект MVC 5 для запуска на платформе x86 из-за битности Oracle. Я продолжал получать те же ошибки:
не удалось загрузить файл или сборку " Oracle.DataAccess' или один из его зависимости. Была сделана попытка загрузить программу, имеющую неверный формат.
я перезагрузил пакеты NuGet, я использовал копии DLL, которые работали для других в разных приложениях, я установил кодовую базу в зависимой сборке, чтобы указать на папку bin моего проекта, я попробовал CopyLocal как true или false, я попробовал все. Наконец, я сделал достаточно, чтобы проверить свой код,и как новый подрядчик я не имел subversion. Ища способ подключить его к VS, я споткнулся об ответ. Что я нашел работал был снят флажок" Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов " в разделе Проекты и решения => веб-проекты в меню Сервис=>Параметры.
то, что я нашел, работало, проверяя опцию "Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов" в разделе "Проекты и решения => веб-проекты "в меню" Инструменты=>Параметры".
обычно это может произойти, когда вы изменили целевую структуру .csproj и вернул его обратно к тому, с чего вы начали.
убедитесь, что 1, если supportedRuntime version= "другая среда выполнения от CS project target" под тегом запуска в приложении.конфиг.
убедитесь, что 2, что также означает проверку других автогенерированных или других файлов в папке свойств, чтобы увидеть, нет ли больше несоответствия времени выполнения между этими файлами и тем, который определен в .csproj файл файл.
Это может просто сэкономить вам много времени, прежде чем вы начнете пробовать разные вещи со свойствами проекта, чтобы преодолеть ошибку.
У меня была та же проблема, хотя у меня 64-разрядная Windows 7, и я загружал 64-битную DLL b/c в свойствах проекта | сборке, я "предпочитал 32-бит". (Не знаю, почему это установлено по умолчанию). Как только я снял этот флажок, все прошло нормально
при попытке запустить отладку приложения вы получите BadImageFormatException.
удаление строки, объявляющей v2.Версия 0 очистит ошибку.
фон
мы начали получать это сегодня, когда мы переключили нашу службу WCF с AnyCPU на x64 на сервере Windows 2012 R2 под управлением IIS 6.2.
Сначала мы проверили единственную ссылочную сборку 10 раз, чтобы убедиться, что на самом деле это не dll x86. Затем мы проверили пул приложений много раз, чтобы убедиться, что он не включает 32-битные приложения.
по прихоти я попытался переключить настройку. Оказывается, пулы приложений в IIS были по умолчанию Включить 32-Разрядные Приложения значение False, но IIS почему-то игнорировал его на нашем сервере и всегда запускал нашу службу в режиме x86.
решение
- выберите пул приложений.
- выбрать Установить Пул Приложений По Умолчанию. или Дополнительные Параметры. .
- изменить Включить 32-Разрядные Приложения в true.
- клик OK.
- выбрать Установить Пул Приложений По Умолчанию. или Дополнительные Параметры. снова.
- изменить Включить 32-Разрядные Приложения вернуться к False.
- клик OK.
я исправил эту проблему, изменив веб-приложение для использования другого "пула приложений".
для всех, кто может прибыть сюда в более позднее время. У меня ничего не получалось. Все мои собрания были прекрасны. У меня была конфигурация приложения в одном из моих проектов Visual Studio, которой не должно было быть. Поэтому убедитесь, что файл конфигурации приложения необходим.
Я удалил дополнительную конфигурацию приложения, и это сработало.
определите пул приложений, используемый приложением, и установите свойство, установив для 32-разрядных приложений значение True. Это можно сделать с помощью предварительных настроек пула приложений.
при создании приложений для 32-разрядной или 64-разрядной платформы (мой опыт работы с Visual Studio 2010) Не полагайтесь на Configuration Manager для установки правильной платформы для исполняемого файла. Даже если CM выбрал x86 для приложения, проверьте свойства проекта (вкладка "сборка"): он все равно может сказать" любой процессор". И если вы запустите исполняемый файл "Any CPU" на 64-разрядной платформе, он будет работать в 64-разрядном режиме и откажется загружать сопровождающие вас библиотеки DLL, созданные для x86 платформа.
для тех, кто может прибыть сюда позже.
Для настольного решения я получил BadImageFormatException исключения.
Все параметры сборки проекта были прекрасны (all x86 ). Но проект запуска решения был изменен на какой-то другой проект(проект библиотеки классов).
изменение начального проекта на исходный(.exe application project) было решением в моем случае
когда я столкнулся с этой проблемой, следующее решило ее для меня:
Я вызывал dll OpenCV изнутри другого exe, моя dll не содержала уже необходимые библиотеки OpenCV, такие как highgui, features2d и т. д., доступные в папке моего exe-файла. Я скопировал все это в каталог моего exe-проекта, и он внезапно сработал.
удалите зависимость от системы.Время выполнения в вашем интернете.Config, это сработало для меня:
эта ошибка "не удалось загрузить файл или сборку "пример" или одну из ее зависимостей. Попытка загрузки программы с неправильным форматом " обычно вызвана неправильной конфигурацией пула приложений.
- убедитесь, что в AppPool, на котором работает ваш сайт, установлено значение "включить 32-разрядные приложения" False.
- убедитесь, что вы используете правильную версию для вашей платформы.
- Если вы получаете эту ошибку на сайте, убедитесь, что пул приложений запущен в правильном режиме (сайты 3.0 должны работать в 64-разрядном режиме)
- вы также должны убедиться, что ссылка на эту сборку в visual studio указывает на правильный файл в папке packages.
- убедитесь, что у вас есть правильная версия dll, установленная в GAC для сайтов 2.0.
- Это также может быть вызвано продвижением WSODLibs с помощью веб-проекта.
кроме того, вы можете добавить идентификатор среды выполнения для .csproj файл. Если понадобится .exe для запуска как x86, чтобы он мог загрузить собственную DLL x86, добавьте этот элемент в PropertyGroup :
хорошее место, чтобы положить это сразу после TargetFramework или TargetFrameworks элемент.
Свойства
Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении.
Возвращает имя файла, вызвавшего данное исключение.
Возвращает имя журнала, в котором описано, почему загрузка сборки не выполнена.
Получает или задает ссылку на файл справки, связанный с этим исключением.
Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.
Возвращает экземпляр класса Exception, который вызвал текущее исключение.
Возвращает или задает имя приложения или объекта, вызывавшего ошибку.
Получает строковое представление непосредственных кадров в стеке вызова.
Возвращает метод, создавший текущее исключение.
Properties
Gets a collection of key/value pairs that provide additional user-defined information about the exception.
Gets the name of the file that causes this exception.
Gets the log file that describes why an assembly load failed.
Gets or sets a link to the help file associated with this exception.
Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.
Gets the Exception instance that caused the current exception.
Gets the error message and the name of the file that caused this exception.
Gets or sets the name of the application or the object that causes the error.
Gets a string representation of the immediate frames on the call stack.
Gets the method that throws the current exception.
Constructors
Initializes a new instance of the BadImageFormatException class.
Initializes a new instance of the BadImageFormatException class with serialized data.
Initializes a new instance of the BadImageFormatException class with a specified error message.
Initializes a new instance of the BadImageFormatException class with a specified error message and a reference to the inner exception that is the cause of this exception.
Initializes a new instance of the BadImageFormatException class with a specified error message and file name.
Initializes a new instance of the BadImageFormatException class with a specified error message and a reference to the inner exception that is the cause of this exception.
Комментарии
Это исключение возникает, если формат файла динамической библиотеки ссылок (.dll файла) или исполняемого файла (.exe файла) не соответствует формату, который ожидает среда CLR. В частности, исключение возникает при следующих условиях:
Вы пытаетесь загрузить эталонную сборку в контексте, отличном от контекста только для отражения. Эту проблему можно решить двумя способами:
- Сборку реализации можно загрузить, а не эталонную.
- Вы можете загрузить эталонную сборку в контексте только для отражения, вызвав Assembly.ReflectionOnlyLoad метод.
Библиотека DLL или исполняемый файл загружается как 64-разрядная сборка, но содержит 32-разрядные компоненты или ресурсы. Например, он использует com-взаимодействие или вызывает методы в 32-разрядной библиотеке динамических ссылок.
Чтобы устранить это исключение, задайте целевому свойству платформы проекта значение x86 (вместо x64 или AnyCPU) и перекомпилируйте его.
Отражение исполняемых файлов C++ может вызвать это исключение. Причина этого, вероятнее всего, в том, что компилятор C++ чередует адреса переадресации и раздел .Reloc исполняемого файла. Чтобы сохранить адреса переадресации в исполняемом файле C++, укажите при компоновке параметр /fixed:no .
BadImageFormatException использует HRESULT COR_E_BADIMAGEFORMAT , имеющий значение 0x8007000B.
Список начальных значений свойств для экземпляра BadImageFormatException, см. в разделе BadImageFormatException конструкторы.
Remarks
This exception is thrown when the file format of a dynamic link library (.dll file) or an executable (.exe file) doesn't conform to the format that the common language runtime expects. In particular, the exception is thrown under the following conditions:
You are trying to load a reference assembly in a context other than the reflection-only context. You can address this issue in either of two ways:
- You can load the implementation assembly rather than the reference assembly.
- You can load the reference assembly in the reflection-only context by calling the Assembly.ReflectionOnlyLoad method.
A DLL or executable is loaded as a 64-bit assembly, but it contains 32-bit features or resources. For example, it relies on COM interop or calls methods in a 32-bit dynamic link library.
To address this exception, set the project's Platform target property to x86 (instead of x64 or AnyCPU) and recompile.
Reflecting on C++ executable files may throw this exception. This is most likely caused by the C++ compiler stripping the relocation addresses or the .Reloc section from the executable file. To preserve the .relocation address in a C++ executable file, specify /fixed:no when linking.
BadImageFormatException uses the HRESULT COR_E_BADIMAGEFORMAT , which has the value 0x8007000B.
For a list of initial property values for an instance of BadImageFormatException, see the BadImageFormatException constructors.
Methods
Determines whether the specified object is equal to the current object.
When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.
Serves as the default hash function.
Sets the SerializationInfo object with the file name, assembly cache log, and additional exception information.
When overridden in a derived class, sets the SerializationInfo with information about the exception.
Gets the runtime type of the current instance.
Creates a shallow copy of the current Object.
Returns the fully qualified name of this exception and possibly the error message, the name of the inner exception, and the stack trace.
Events
Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.
The problem exists on both Windows 7 64-bit (dev) and Windows XP SP3 32-bit (target) systems.
Here is what I've tried so far:
- Verified build settings such as Platform Target are all the same (x86).
- Used peverify with the /verbose option to ensure the assembly binaries were valid.
- Uses fuslogvw to look for any loading issues.
- Used CheckAsm to look for missing files or assembiles.
All of these checks didn't change anything. I've included the full text of the exception information below, with some of the names changed to protect the secrets of my corporate masters.
You are on the right track that this exception is associated with x86/x64 bit differences. I assume this is not a web application right? Also, what type of assembly is XxxDevicesService ? Is it compiled for a specific platform (e.g. 32 bit)? If so, then you must compile your platform to 32 bit.
Читайте также: