System dllnotfoundexception не удается загрузить dll
Репутация: нет
Всего: нет
Хочу активировать окно приложения. Для этого добавил вызов ряда функций, среди которых есть такая:
Но при попытке вызова получаю ошибку, в которой говорится:
Цитата |
System.DllNotFoundException: Не удается загрузить DLL "coredll.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E) |
Пробовал вместо coredll.dll указать core.dll (пальцем в небо), но результат тот же. Пробовал искать в системе указанную библиотеку - не находит.
Подскажите, пожалуйста, как решить проблему.
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Репутация: 18
Всего: 141
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит
Репутация: 1
Всего: 1
Если вы не можете найти, почему CLR должен смочь? )) Система у вас с CLR одна на двоих. Нужно разобраться с примером, из которого вы взяли код - что это за библиотека и откуда она. Может быть ваш пример был предназначен под Windows CE например и т.д.
Скорее всего diadiavova прав, но лучше вам разобраться, а не тыкать пальцем в небо.
Репутация: нет
Всего: нет
Я догадался, что нет нужной мне библиотеки (той, которая была в примере кода). И я поэтому специально написал, что использую Windows 7, т.к. подумал, что может быть пример кода отличается поведением в разных ОС. В общем, ДядяВова прав, надо было другую длл указать. Спасибо за ответ!
У меня теперь появилась другая проблема . Окно нахожу, открываю
но оно открывается только, если не свернуто. Т.е. если окно находится за другим - отрабатывает как положено. А если нажать на кнопку "свернуть", то оно просто активируется (подсвечивается) в панеле задач. Как мне его развернуть?
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Репутация: 18
Всего: 141
Злой доктор Щасзаболит
Репутация: нет
Всего: нет
diadiavova, ну, что я могу сказать. Ты как всегда ! Спасибо!
"Окно приложения" - это не форма моего приложения, а окно какого-то запущенного "левого" приложения. С помощью UIAutomation получилось достичь эффекта, который я достиг до создания этой темы (могу активировать окно, если оно не свернуто). Если можно как-то развернуть окно - сообщите, пожалуйста (академический интерес ). А через WinAPI получилось развернуть .
Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
Репутация: 18
Всего: 141
Ну что-то типа такого. Этот код разворачивает окно блокнота(первое, которое найдет), в данном случае во весь экран, но можно установить Normal
Код |
using System; using System.Collections.Generic; using System.Text; using System.Windows.Automation; using System.Linq; |
Злой доктор Щасзаболит
Репутация: нет
Всего: нет
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.
[ Время генерации скрипта: 0.1207 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Удалил бету WIN7 x86 (Build 7100) и поставил лицензионную Windows7 x64 !!
Студия стала ровно (без ошибок), проект компилится но если запускать из студии, то мой движок не загружается вообще, а тупо пустое окно стоит, а если скомпилить и запустить EXE не из студии, то появляется такая ошибка:
Явно видно, что библиотека ODE не найдена! Но она ЕСТЬ! она лежит и рядом с EXE и в System32. (положил вручную. Установщиков у ODE вроде нету)
В чём жё фишка? я так подозреваю, что более защищённая версия x64 винды не разрешит тупо скопировать dll -> её нуна както зарегать? или нет? Факт: есть библиотека но прога её не видит! А в x86 винде всё в норме!
Заранее мегоблагодарен за помощь.
JokerR
да, 32-битная! Но и Target platform у проекта стоит x86! А 32 битный процесс может грузить 32 битные dll
L
тогда странне, ещё, почему у тебя
L
Проверь что точно запущенный процесс 32-битный, к примеру с помощью Process Explorer.
KindDragon
проверил. Да, 32 битный запущен!!
вообщем, создал пустой проект и сзделал вызов только 1 функции из ode! РАБОТАЕТ! Я посмотрел - не у всех длл двига (а в двиге много dll) стояла платформа x86 !! я УДАЛИЛ все платформы, создал новую x86, скомпилил и фиг - таже ошибка. Получается - дело в настройках! Но платформу КАЖДОЙ DLL я заменил на x86. Странно, что не работает! Может у кого есть какие предположения, какие настройки проекта могут на это повлиять??
В общем, и DLL Hell никто не отменял, и переход 32->64 будет не менее весёлым, чем в своё время 16->32.
>> я так подозреваю, что более защищённая версия x64 винды не разрешит тупо скопировать dll -> её нуна както зарегать? или нет? Факт: есть библиотека но прога её не видит! А в x86 винде всё в норме!
Бывает и такое. Почитай матюги в интернетах про side-by-side и манифесты :)
блин.. скопировал ode.dll и в System32 и в SysWOW64 и в папку с EXE-шником! Пофиг!! - не видит длл. : ((
holy sh.. вообщем, уже второй раз попался на эту фишку : ) у мну старый ODE - ему нужна msvcp71.dll а со студией она не ставится. теперь всё работает. Большое спасибо всем ответившим.
То, что ты копировал dll в системные каталоги, может и не работать, так задумано :)
сам постояно сталкиваюсь, и всегда проблема из за того что CRT нету, то в релизе, то в дебаге на конечной машине с другой системой.
Когда я запускаю свое приложение в VS, все работает нормально. Однако всякий раз, когда я публикую его (с помощью ClickOnce) и пытаюсь запустить приложение, оно вылетает со следующей ошибкой: System.DllNotFoundException: не удалось загрузить DLL 'SQLite.Interop.dll': указанный модуль не найден (исключение из HRESULT: 0x8007007E)
После некоторого исследования я нашел эту dll в папке Debug и скопировал ее в папку, где создается версия моей программы ".exe" (после публикации и выполнения "setup.exe"). Таким образом, приложение работает нормально.
Но я не очень доволен этим решением, так как оно кажется действительно грязным. Я не хочу, чтобы будущим пользователям приходилось делать это вручную при установке моего приложения!
Поэтому у меня вопрос: что я могу сделать, чтобы эта dll была установлена вместе с моей программой?
Примечание. Я попробовал первый ответ в этом посте: невозможно загрузить dll sqlite interop dll WPF Но, похоже, я не работал на меня.
Вероятно, вам нужно включить папки x86 и x64 в другую DLL SQLite.
Изменить: я добавил соответствующую информацию ниже на случай, если указанная выше ссылка когда-либо умрет / изменится.
Если на машинах разработчика и клиента могут быть разные архитектуры процессоров, может потребоваться более одного двоичного пакета. В этой ситуации настоятельно рекомендуется использовать функцию предварительной загрузки собственной библиотеки. Он доступен с версии 1.0.80.0 и включен по умолчанию. Чтобы воспользоваться преимуществами этой функции, отдельные управляемые сборки и сборки взаимодействия должны использоваться с развертыванием XCOPY (т. Е. Эта функция не поддерживается сборкой смешанного режима или когда сборка развертывается в глобальном кэше сборок), в результате чего развертывание приложения, которое выглядит примерно так:
- bin \ App.exe (необязательная, исполняемая сборка только управляемого приложения)
- bin \ App.dll (необязательная сборка библиотеки только управляемого приложения)
- bin \ System.Data.SQLite.dll (обязательная, только управляемая сборка ядра)
- bin \ System.Data.SQLite.Linq.dll (необязательная сборка LINQ только для управления)
- bin \ System.Data.SQLite.EF6.dll (необязательная, только управляемая сборка EF6)
- bin \ x86 \ SQLite.Interop.dll (требуется, собственная сборка взаимодействия x86)
- bin \ x64 \ SQLite.Interop.dll (требуется, собственная сборка взаимодействия x64)
Строка «bin» выше представляет каталог, в котором двоичные файлы приложения должны быть развернуты на целевой машине. При включенной функции предварительной загрузки собственной библиотеки и развертывании приложения, показанном выше, управляемая сборка System.Data.SQLite попытается автоматически определить архитектуру процессора текущего процесса и предварительно загрузить соответствующую собственную библиотеку.
Я также столкнулся с аналогичной проблемой в моей среде Visual Studio 2017 и NET Framework 4.5, обстоятельства таковы:
Я сравнил две среды и обнаружил, что файл DLL «SQLite.Interop.dll» не был опубликован на клиентском компьютере, что мы видим на следующем рисунке.
Итак, мое решение - добавить эти две библиотеки DLL в проект, а затем их можно будет опубликовать на клиентском компьютере с помощью ClickOnce.
(Примечание: выбранная версия DLL должна быть такой же, как версия NET Framework в вашей среде.)
Не храните dll самостоятельно и не копируйте ее в / bin вручную, она потеряет контроль над обновлением версии и зависимостью.
TL; DR;
для старого файла csproj:
для нового файла csproj: (т.е. проекты, начинающиеся с <Project Sdk="Microsoft.NET.Sdk.*"> )
Если это устанавливаемый файл. то есть, если вы создаете файл установки, вам необходимо вручную добавить dll в основной выходной файл.
Перейдите в свойства проекта установки и в настройках конфигурации выберите необходимые компоненты SQLite, выберите (Флажок) установить его из местоположения проекта.
Посмотрите, решит ли это вашу проблему.
«Примечание: я попробовал первый ответ этого поста: не удалось загрузить dll sqlite interop dll WPF, но, похоже, у меня не получилось».
Я тоже пробовал это, и, наконец, он заработал. Однако важно следующее:
- Вставьте sqlite.interop.dll как существующий элемент в корень проекта, который вы собираетесь построить.
- В свойствах этого файла убедитесь, что его обработка сборки является «содержимым» (а не встроенным ресурсом, как предлагается) и, конечно же, всегда копируется в выходной каталог.
Надеюсь, что это поможет победить эту надоедливую ошибку.
На SQlite.Interop нельзя ссылаться, вам необходимо:
В вашем проекте VS добавьте существующий файл: Sqlite.Interop.dll actual расположение: \ bin \ Debug \ x86 или \ bin \ Debug \ x64
Выберите свойства и установите действие компиляции в "Содержимое" и скопируйте в выходной каталог = "Всегда копировать"
Восстановить
Пакет Nuget System.Data.SQLite включает папку Build с целевым файлом, который будет копировать эти DLL взаимодействия. Чтобы решить эту проблему, мы должны были сообщить проекту, который мы упаковываем в наш собственный nuget, чтобы НЕ исключать эту цель / папку сборки.
Наш проект (тот, который мы упаковываем, а затем используем в другом месте) должен иметь PrivateAssets = "None" или PrivateAssets = "Analyzers", если вы хотите убедиться, что в него не включены анализаторы.
Читайте также: