System.IO.FileLoadException: не удалось загрузить файл или сборку 'System.Data.SQLite
(Это дублированный вопрос, заданный в stackoverflow.com. Я прочитал ответы. Я пробовал решения, но это не решило мою проблему. Я объясню, что моя проблема и что я сделал).
Это моя проблема:
В моем приложении используется System.Data.SQLite.DLL. Я ссылался на него и работал нормально на своем компьютере, но он не запускался на другом компьютере. Это сообщение об ошибке:
System.IO.FileLoadException: не удалось загрузить файл или сборку 'System.Data.SQLite, Version = 1.0.88.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139 'или одна из его зависимостей. Приложение не запускалось, потому что его бок о бок неправильная конфигурация. См. Приложение войдите в систему или используйте инструмент командной строки sxstrace.exe для более подробной информации.
(Исключение из HRESULT: 0x800736B1) Имя файла: 'System.Data.SQLite, Версия = 1.0.88.0, Культура = нейтральная, PublicKeyToken = db937bc2d44ff139 ' --- > System.Runtime.InteropServices.COMException(0x800736B1): Приложение не запускалось, потому что его бок о бок неправильная конфигурация. См. Журнал событий приложения или используйте инструмент командной строки sxstrace.exe для более подробной информации.
(Исключение из HRESULT: 0x800736B1) в SimPB.config.PrepareDatabase() в SimPB.config.InitializeProgram() в SimPB.Program.Main()
Мой компьютер работает под управлением Windows 7 32 бит, Visual Studio 2010.
Другой компьютер работает под управлением Windows 7 32 бит, без установки Visual Studio.
Что я пробовал:
Попытка 1: Убедитесь, что приложение построено с помощью Release + x86, и приложение построено с целевой структурой: .NET Framework 2.0 > . Готово.
Попытка 2: Убедитесь, что приложение ссылается на правильную сборку System.Data.SQLite, которая представляет собой x86 +.Net Framework 2.0 (sqlite-netFx20-binary-Win32-2005-1.0. 88,0). Готово
Попытка 3: Попробуйте эти коды в App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
и этот
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>
</configuration>
и этот
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
Готово.
Попытка 4: Попробуйте отключить контроль учетных записей пользователей на другом компьютере. Готово.
Попытка 5: Попробуйте установить Visual С++ Runtime на другом компьютере (я устанавливаю VIS-пакет Visual С++ Runtime 2010 (x86), также попробовал 2005 verson.). Готово.
Попытка 6: Попробуйте переустановить .NET Framework 2.0 с пакетом обновления 2 (SP2). Ошибка получения:
Вы должны использовать "Включить или отключить функции Windows" на панели управления, чтобы установить или настроить Microsoft.NET Framework 2.0 SP2.
Обновлено: (После чтения ответов и комментариев)
Попытка 7: Убедитесь, что файл System.Data.SQLite.DLL находится в папке выходного бина. Готово
Попытка 8: Двойное подтверждение, что на другом компьютере работает 32-разрядная Windows 7. Выполнено
Попытка 9: Измените объявление HintPath в файле .csproj:
Измените это:
<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
<HintPath>E:\Developer Soft\SQLite\sqlite-netFx20-binary-bundle-Win32-2005-1.0.88.0\System.Data.SQLite.dll</HintPath>
</Reference>
Для этого:
<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
<HintPath>..\System.Data.SQLite.dll</HintPath>
</Reference>
Готово для попытки 9.
После этих попыток результат остается тем же. Приложение может нормально работать с моего компьютера и не запускаться на другом компьютере.
Это бесплатное ПО с открытым исходным кодом, Простая телефонная книга. Я зафиксировал и загрузил последний исходный код на сервер управления версиями:
http://simpb.codeplex.com/SourceControl/list/changesets (Номер набора изменений: fd847ac6c406)
Ответы
Ответ 1
Я решил проблему. Вот как я решаю:
Рассказ:
Используйте более раннюю версию System.Data.SQLite. Предполагается, что в новой версии есть ошибки (я могу ошибаться).
Длинная история:
Я начал вспоминать, почему моя предыдущая старая версия этой программы может быть выполнена на другом компьютере, и эта новая версия не может. Каковы очевидные изменения, которые я сделал?
Да, я изменил версию System.Data.SQLite.
Старая версия System.Data.SQLite, используемая этой программой, V1.0.66. Новая версия, которую я использовал, - это последняя версия: V1.0.88, выпущенная на 8 августа 2013 года. (Да, это около 4 дня назад с сегодняшнего дня). Подробнее: http://system.data.sqlite.org/index.html/timeline
Затем я решил использовать новую версию (V1.0.88) и использовал старую версию (V1.0.66), и все было в порядке. Программа снова выполняется на другом компьютере.
Я попытался взглянуть на исходный код V1.0.88, но мне не удалось найти строки кода, которые вызывают проблему. Лучшее, что я могу обнаружить, - это проект System.Data.SQLite.Interop. Когда я загружаю решение в Visual Studio 2010, System.Data.SQLite.Interop устанавливается для .NET Framework 4.0. Я не знаю, как это изменить. Позже я перезагружаю решение в Visual Studio 2008, общие свойства System.Data.SQLite.Interop, показывающие, что он собирается создать для .NET Framework 2.0 (это то, что я ищу), но я не могу построить решение. Некоторые ошибки сборки возникают. Я не тратил время на его отладку.
Мне нужно разработать программу для .NET Framework 2.0, потому что есть пользователи, которые все еще используют Windows XP.
Я предполагаю, что V1.0.88 содержит ошибки, но я могу ошибаться. Во всяком случае, что касается текущего решения, я просто придерживаюсь V1.0.66.
Ответ 2
Сборка не может быть найдена из-за объявления HintPath в вашем файле .csproj:
<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
<HintPath>E:\Developer Soft\SQLite\sqlite-netFx20-binary-bundle-Win32-2005-1.0.88.0\System.Data.SQLite.dll</HintPath>
</Reference>
Он работает на вашей машине, потому что у вас действительно есть .dll в этом месте. Однако другой человек может захотеть использовать файл System.Data.SQLite.dll, который вы разместили в корне репозитория. Поскольку это на один уровень выше .csproj, вы можете использовать относительный путь, например:
<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
<HintPath>..\System.Data.SQLite.dll</HintPath>
</Reference>
и он должен работать нормально.
Ответ 3
У меня также были проблемы с SQLite с версии 1.0.66 на машинах x64/x86. Я никогда не мог установить ServiceStack, а затем SqLite.x86 с пакетом nuget и заставить его работать из коробки.
Но сегодня я сменил процесс установки на успешные, и это может быть и решение для вас. Я подозреваю, что проблема всегда в том, что версия System.Data.SQlite не согласована с одной службой Servicestack.Ormlite.SqliteNET ожидает.
Следующий процесс в консоли Nuget позволяет мне работать:
Install-Package System.Data.Sqlite.x86 -Version 1.0.88.0
Install-Package ServiceStack -Version 3.9.71
Install-Package ServiceStack.OrmLite.Sqlite32 -Version 3.9.71
Ответ 4
В вашем файле App.config добавьте эти строки внутри элемента <configuration>
:
<runtime>
<loadFromRemoteSources enabled="true"/>
</runtime>
Ответ 5
Проверьте, запущена ли запущенная дистрибутива MS Visual С++, поскольку System.Data.SQLite зависит от нее.