Подтвердить что ты не робот

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)

4b9b3361

Ответ 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 зависит от нее.