2009-10-25 2 views
6

Я написал приложение, которое использует sqlite, и отлично работает на самых систем. Он написан на C#, и единственная некадровая сборка - sqlite, которая включена в System.Data.SQLite.dll.На некоторых компьютерах приложение не может загрузить файл sqlite dll

Я развертываю его одинаково на всех компьютерах (скопируйте файл exe, файл базы данных и файл System.Data.SQLite). Он отлично работает для всех моих ПК и большинства компьютеров, которые я пробовал.

Но тогда я получил сообщения, что для некоторых людей это бросает следующее исключение:

Не удалось загрузить файл или сборку « System.Data.SQLite, Version = 1.0.65.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 'или - одна из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом .

Теперь я убедился, что файл dll находится в той же папке, что и файл exe приложения. Это одна и та же DLL с той же версией, что и в вышеприведенном сообщении об исключении.

Я был очень смущен этим, поэтому создал новую виртуальную машину, установил на нее Windows 7 Professional и просто скопировал вложенные файлы, и это сработало. Поэтому, если он работает на свежих окнах, я не могу себе представить, что другие ПК могут отсутствовать ...

Примечание: Две из тех машин, где проект выбрасывает исключение, также работают с Windows 7 proffesional.

Я был бы очень признателен за любую помощь по этому вопросу, потому что я свежий из идей ...

ответ

12

Вот возможность: Какова разница между рабочими и не-рабочими машинами 32-битной версией или 64- немного? Вы строите для «Любой процессор», когда вы должны строить только битту вашей внешней DLL?

+0

Спасибо! Полностью упущенный, что sqlite.NET имеет два разных файла dll - для x32 и x64. Я сменил dll на машины, на которых он не работал, и теперь он работает. Я никогда не думал, чтобы спросить их о 32 против 64 бит ... –

+0

Есть ли способ проверить во время выполнения, если платформа 32/64 бит и действовать соответственно в этом случае? – Ben

+0

@Ben: Боюсь, я не знаю. Вам нужно будет динамически загружать нужную DLL-библиотеку sqlite во время выполнения, но я не знаю, как это сделать в .net. – RichieHindle

1

Возможно, что машины, генерирующие исключение, используют 64-разрядную версию Windows и что ваша программа использует конфигурацию AnyCPU. DLL System.Data.SQLite - двуликий зверь: управляемая часть и родная часть. Может быть, ответственность за исключение несет собственная часть.

См. this question для получения дополнительной информации.

1

Вы проверили, является ли целевая система 64-разрядной или 32-разрядной?

Возможно, для одной из ваших зависимостей требуется 32-разрядная версия Windows. Чтобы решить проблему, вы можете указать целевую платформу в свойствах вашего проекта C#: выберите x86 вместо Any CPU.

Смежные вопросы