Я установил ELMAH 1.1.Net 3.5 x64 в моем проекте ASP.NET, и теперь я получаю эту ошибку (всякий раз, когда я пытаюсь увидеть любую страницу):
Не удалось загрузить файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтрально, PublicKeyToken = db937bc2d44ff139 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.
Описание: необработанное исключение произошло во время выполнение текущей сети запрос. Просмотрите трассировку стека для получения дополнительной информации об ошибке и где он возник в коде.
Сведения об исключении: System.BadImageFormatException: возможно не загружать файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтрально, PublicKeyToken = db937bc2d44ff139 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.
Подробные сведения об ошибках внизу.
Платформа My Active Solution - "Любой процессор", и я работаю на x64 Windows 7 на процессоре x64, конечно же. Причина, по которой мы используем эту версию ELMAH, заключается в том, что 1.0.Net 3.5 (x86, которая является единственной платформой, для которой она была скомпилирована) дала нам такую же ошибку на нашем сервере Windows x64.
Я пробовал компиляцию для x86 и x64, и я получаю ту же ошибку. Я попытался удалить все выходные данные компилятора (bin и obj). Наконец, я напрямую ссылался на SQLite dll, что не было необходимо для работы проекта на сервере, и у меня есть эта ошибка компилятора:
Ошибка 1 Предупреждение как ошибка: сборка сборки - ссылочная сборка "System.Data.SQLite.dll" нацелена на другой процессор MyProject
Любые идеи, что может быть проблемой?
Дополнительные сведения об ошибке:
Ошибка источника:
Создано необработанное исключение во время выполнения текущего веб-запрос. Информация о происхождение и местоположение исключения могут быть идентифицированы с использованием исключения трассировка стека ниже.
Трассировка стека:
[BadImageFormatException: не удалось загрузить файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтрально, PublicKeyToken = db937bc2d44ff139 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Доказательства assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad(String assemblyString, Доказательство assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) +142 System.Reflection.Assembly.Load(String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +46[ConfigurationErrorsException: возможно не загружать файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтрально, PublicKeyToken = db937bc2d44ff139 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +203 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax() +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +337[HttpException (0x80004005): не удалось загрузить файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтрально, PublicKeyToken = db937bc2d44ff139 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +512 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729[HttpException (0x80004005): не удалось загрузить файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтрально, PublicKeyToken = db937bc2d44ff139 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext контекст) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext контекст) +85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +259
System.Data.SQLite.dll
представляет собой смешанную сборку, то есть содержит как управляемый код, так и собственный код. Поэтому конкретный System.Data.SQLite.dll
является либо x86, либо x64, но не тем и другим.
Обновление (любезно предоставлено J. Pablo Fernandez): Cassini, веб-сервер разработки, используемый Visual Studio при нажатии F5 или нажатии зеленой кнопки "play", является только x86, что означает, что даже если ваша рабочая станция - x64, вы сможете использовать только x86-версию System.Data.SQLite.dll.
Альтернативой не является использование Cassini, но IIS7, который правильно x64.
Убедитесь, что для параметра "Включить 32-разрядные приложения" установлено значение "false" для пула приложений.
Перейдите к IIS7 Application Pool -> advanced settings and set the 32-bit application to true
.
Это очень просто, если вы не используете SQLite:
Вы можете удалить DLL-библиотеки SQLite из своих папок с ячейками решения, а затем из папки, где вы ссылаетесь на ELMAH. Перестройте, и ваше приложение не будет пытаться загрузить эту DLL, которую вы не используете.
У меня есть 64-битная dev-машина и 32-битный сервер сборки. Я использовал этот код до инициализации NHibernate. Работает на любой архитектуре (ну, я тестировал 2)
Надеюсь, это поможет кому-то.
Гвидо
private static void LoadSQLLiteAssembly()
{
Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
FileInfo fi = new FileInfo(dir.AbsolutePath);
string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
}
private static string GetAppropriateSQLLiteAssembly()
{
string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
}
Как и тот, кому приходилось иметь дело с довольно многими сообщениями об ошибках в Roadkill Wiki с точно такой же проблемой, вам нужно сделать следующее:
System.Data.SQLite.dll
System.Data.SQLite.Linq.dll
Это реальная боль в заднице, сколько обручей вам нужно перепрыгнуть при повторном распространении двоичных файлов SQLite.NET, мое решение для Roadkill в конце концов состояло в том, чтобы скопировать правильные двоичные файлы в папку ~/bin на основе архитектура ваш использование. К сожалению, это не решает проблему выполнения С++.
Я решил это, установив System.Data.SQLite с расширением Nuget. Это расширение может использоваться для Visual Studio 2010 или выше. Во-первых, вам нужно установить расширение Nuget. Вы можете здесь:
Во-вторых, теперь вы можете установить SQLite:
И теперь вы можете использовать System.Data.SQLite.
В этом случае вы видите две папки x64 и x86, эти папки содержат SQLite.Interop.dll. Теперь перейдите в окна свойств этих DLL и установите, что действие сборки - это содержимое, а Copy для вывода - это Copy всегда.
Итак, это мой путь.
Спасибо. Ким Тхо Фам, HoChiMinh City, Вьетнам. Электронная почта: [email protected]
Ручная сборка System.Data.SQLite, связанная с загрузкой вручную, может решить эту проблему.
Изменен код gatapia, как показано ниже:
public static void LoadSQLLiteAssembly()
{
Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
FileInfo fi = new FileInfo(dir.AbsolutePath);
string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
Assembly.LoadFrom(appropriateFile);
}
private static string GetAppropriateSQLLiteAssembly()
{
string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
return "System.Data.SQLite.x" + arch + ".DLL";
}
Я получил эту ошибку, когда наш сервер Windows был преобразован из 32-разрядной ОС в 64 бит. Сборка, которая выбрасывала ошибку, была настроена на компиляцию в режиме x86 (т.е. режим 32). Я переключил его на "Любой процессор", и это сделало трюк. Вы можете изменить это значение, выполнив следующие действия:
щелкните правой кнопкой мыши по проекту, перейдите к Properties -> Build -> Platform Target -> change to "Any CPU"
Я решил это, как ни странно, установкой System.Data.SQLite через приложение Nuget GUI, в отличие от консоли диспетчера пакетов.
Установка через консоль не включала зависимости, которые должна выполнять эта библиотека.
В нашем случае это не сработало, потому что наш производственный сервер отсутствовал
Распространяемый пакет Microsoft Visual С++ 2010 с пакетом обновления 1 (x86)
Мы установили его, и все работает нормально. Пул приложений должен иметь Разрешенные 32-разрядные приложения, установленные в true, и вы должны иметь версию библиотеки x86
Еще один способ обойти это - просто обновить приложение до ELMAH 1.2, а не 1.1.
Я придумал 2 быстрых решения. Либо работа для меня. Я думаю, проблема связана с разрешениями.
1) Вместо использования файла Elmah.dll из каталога net-2.0 я использовал Elmah.dll из net-1.1.
2) Вместо того, чтобы хранить файл Elmah.dll в каталоге bin проекта. Я создаю каталог dll для его ввода.
System.Data.SQLite
имеет зависимость от System.Data.SQLite.interop
, убедитесь, что оба пакета являются одной и той же версией и оба являются x86.
Это старый вопрос, но я пробовал все вышеперечисленное. Я работал над проектом строго x86, поэтому не было двух папок /x 86,/x64. Но по какой-то причине System.Data.SQLite
была другой версией System.Data.SQLite.interop
, как только я вытащил соответствующие DLL, проблема была исправлена.
Если вы используете IIS Express в качестве веб-сервера на своей машине разработки, я бы переключился на Local IIS. Это сработало для меня.
Можете ли вы удалить папку для отладки bin и повторно перекомпилировать?
Или проверьте ссылку на проект на System.Data.SQLite
, отследите, где она находится, затем откройте dll в отражателе. Если вы не можете его открыть, это значит, что DLL повреждена, вы можете найти правильный или переустановить .net framework.