Виндоус виста:Невозможно загрузить DLL «x.dll»:Неверный доступ к ячейке памяти.(DllNotFoundException)

StackOverflow https://stackoverflow.com/questions/29284

Вопрос

Сегодня днем ​​я тестировал компьютер клиента, на котором установлена ​​Windows Vista (у него была домашняя версия, но я тестирую на Business Edition с теми же результатами).

Мы используем .DLL, которая получает идентификатор оборудования компьютера.Его использование очень простое, и созданный мною пример программы работает.Dll - это Это из AzSdk.Фактически, это прекрасно работает под Windows XP.Однако по какой-то странной причине внутри нашего проекта (намного большего) мы получаем следующее исключение:

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

Я не знаю, что может быть причиной проблемы, поскольку у меня есть полный контроль над папкой.Проект представляет собой приложение Windows Forms на C#.net, и все работает нормально, за исключением вызова внешней библиотеки.

Я объявляю это так:(примечание:его нет COM-библиотека, и ее не нужно регистрировать).

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool BIOS, string sRegistrationCode);

И тогда вызывающий код довольно прост:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");
}

Когда вы создаете пример приложения, оно работает, но внутри моего проекта — нет.Под XP работает нормально.Есть идеи, что мне следует сделать в Vista, чтобы это заработало?Как я уже сказал, папка и ее подпапки имеют полный доступ для «Всех».

ОБНОВЛЯТЬ: У меня не установлена ​​Vista SP 1.

ОБНОВЛЕНИЕ 2: Я установил Vista SP1 и теперь, с отключенным UAC, даже простой образец не работает!!!:( Чертова Виста.

Это было полезно?

Решение

@Мартин

Причина, по которой вы не получили приглашение UAC, заключается в том, что UAC может только изменить способ выполнения процесса. начал, после запуска процесса он должен оставаться на том же уровне прав.UAC подскажет, что произойдет, если:

  • Виста думает, что это установщик (здесь много правил, самый простой — если он называется «setup.exe»),
  • Если он помечен как «Запуск от имени администратора» (вы можете отредактировать это, изменив свойства ярлыка или исполняемого файла) или
  • Если exe-файл содержит манифест, запрашивающий права администратора.

Первые два варианта — обходные пути для «устаревших» приложений, существовавших до UAC. Правильный способ сделать это для новых приложений — встроить ресурс манифеста прося привилегий, которые вам нужны.

Какая-нибудь программа, например Обозреватель процессов кажется, что они повышают уровень запущенного процесса (в данном случае, когда вы выбираете «Показать сведения для всех процессов» в меню «Файл»), но на самом деле они запускают новый экземпляр, и именно этот новый экземпляр получает повышение, а не тот, который был изначально работает.Это рекомендуемый способ сделать это, если только некоторые части вашего приложения требуют повышения прав (например,специальный диалог «Параметры администратора»).

Другие советы

Невозможно загрузить DLL «HardwareID.dll»:Неверный доступ к ячейке памяти.(Исключение из HRESULT:0x800703E6)

Имя DllNotFoundException сбивает вас с толку — это не проблема с поиском или загрузкой файла DLL, проблема в том, что при загрузке DLL происходит незаконный доступ к памяти, что приводит к сбою процесса загрузки.

Как и другой автор здесь, я думаю, что это проблема DEP, и что ваши изменения UAC и т. д. наконец позволили вам отключить DEP для этого приложения.

Является ли машина, на которой развернут код, 64-битной машиной?Вы также можете столкнуться с ДЭП проблема.

Редактировать

Это Macbook Pro 1-го поколения с процессором Intel Core Duo 2 1-го поколения.Далеко не 64 бита.

Я упомянул 64-битную версию, потому что на низких уровнях структуры от 32 до 64 бит не обрабатываются должным образом.Поскольку машины не являются 64-битными, то, скорее всего, отключение DEP будет логичным следующим шагом.Vista стала более безопасной, чем XP SP2.

Ну, я только что глобально отключил DEP, но безрезультатно.Та же ошибка.

Ну, я также читал, что люди получали эту ошибку после обновления машины до Vista SP1.Есть ли в этих установках Vista SP1?

Оказывается, это совсем другое.Ради тестирования я отключил UAC (примечание:Никаких подсказок я не получил).

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

Вы отправляли запрос в службу поддержки поставщику?Возможно, в оборудовании MacBook Pro есть что-то, что мешает работе продукта.

Учитывая, что исключением является DllNotFoundException, вы можете попробовать проверить HardwareID.dll с помощью Зависимость Уокер ПЕРЕД установкой любых инструментов разработки при установке Vista, чтобы проверить, действительно ли отсутствует зависимость.

Помимо предоставления полного контроля «Всем», позволяет ли местоположение также писать процессам со средним уровнем целостности?

Как мне это проверить?Я новичок в Vista, мне она не очень нравится, она слишком медленная внутри виртуальной машины для повседневной работы, а для использования VStudio внутри виртуальной машины она не приносит ничего нового.

Из командной строки вы можете выполнить:

icacls C:\Folder

Если вы видите такую ​​строку, как «Обязательная метка\Высокий обязательный уровень», значит, папка доступна только для процесса с высоким уровнем целостности.Если такой строки нет, то процессы средней целостности могут получить к ней доступ при условии, что нет других списков ACL, запрещающих доступ (например, на основе пользователя).

РЕДАКТИРОВАТЬ:Забыл упомянуть, что вы можете использовать переключатель /setintegritylevel, чтобы фактически изменить необходимый уровень целостности для доступа к объекту.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top