Выиграть 7 DllImport C# Нечетная ошибка, Недопустимый доступ к ячейке памяти?

Я использую DllImport для доступа к некоторым функциям в C++ dll из моего приложения C#.

Этот код хорошо работает на моем dev ноутбуке, который является Windows 7 64bit, сам dll составляет 32 бита, таким образом, я выполняю процесс, размещающий dll в 32 битах, и он работает хорошо. Однако, когда я пытаюсь выполнить тот же самый процесс на своей целевой машине, которая является снова, Windows 7 64bit Ultimate, я получаю ошибку 'Недопустимый доступ к ячейке памяти'. от процесса.

Я не уверен, какова проблема, я посмотрел на загрузки ресурсов в сети, и ни один из них не решил ее для меня. Я не понимаю, почему это хорошо работает на моем dev поле, но не на цели?

Сам dll прекрасен, примеры, которые идут с dll, все хорошо работают на моем целевом поле (которые являются приложениями C#, делающими DllImport).

У кого-либо еще была эта проблема? Борьба с ним в течение двух дней теперь!

Исключение: {"Unable to load DLL 'CLEyeMulticam.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)"}

8
задан James 24 July 2010 в 22:03
поделиться

9 ответов

У меня уже была такая проблема. Я думаю, что ваша проблема связана с тем, что VS пытается открыть файл, но не имеет прав на его чтение. Вам нужно убедиться, что используемая вами учетная запись имеет доступ к DLL. Попробуйте отключить UAC, чтобы проверить, работает ли это, или используйте учетную запись администратора. Или попробуйте дать Полный контроль над DLL Всем.

EDIT: Не могли бы вы запустить VS от имени администратора (правый клик -> Run As Administrator)? Не могли бы вы поместить DLL на рабочий стол, чтобы попробовать? Есть ли разница в структуре папок между вашим рабочим компьютером и тем, который не работает? Также, может ли DLL работать нормально, если вы запустите ее вне VS (попробуйте также запустить ее от имени администратора)?

HTH

.
0
ответ дан 6 December 2019 в 02:23
поделиться

Загрузка DLL может завершиться сбоем из-за неразрешенных зависимостей, поэтому откройте свою DLL на целевой машине с помощью Dependency Walker и посмотрите, есть ли проблемы.

1
ответ дан 6 December 2019 в 02:23
поделиться

Я заметил один большая разница между вашей машиной разработчика и целевой машиной, средой разработки. Убедитесь, что на целевой машине есть все необходимые распространяемые файлы.

Изменить: я видел похожие проблемы, когда некоторые библиотеки DLL были скомпилированы в разные версии платформы .Net или если они были созданы с разными версиями Visual Studio, так как распространяемые файлы для каждой версии разные, а последние распространяемые файлы не совсем обратная совместимость.

1
ответ дан 6 December 2019 в 02:23
поделиться

У меня уже были подобные проблемы, попробуйте следующее.

  • Проверьте версию .NET CLR. Есть ли в вашей цели SPs/KBs, которых нет в вашей dev?
  • Попробуйте загрузить отладочную версию C++ DLL. Удается ли вам загрузить ее? Если это не удается, я бы предложил запустить ваше приложение под WinDBG в вашей цели. Как только исключение будет найдено, простой !analyze -v даст вам много информации.
  • В качестве следующего шага, я бы попытался воспроизвести эту проблему в среде модульного тестирования. Упомянутые вами примеры C# собраны для x64 VM? Если нет, попробуйте сделать это и запустить полученный двоичный файл примера в вашей цели. Проблема воспроизводима?
0
ответ дан 6 December 2019 в 02:23
поделиться

Я столкнулся с проблемой с 64-битным .NET-приложением («Любой процессор») пытается загрузить 32-битную собственную зависимость DLL. Передо мной нет сообщения об ошибке, поэтому я не могу сказать вам, та же проблема. Решением моей проблемы было изменить мою сборку только на x86.

Если битовый размер DLL меняется на каждом блоке, возможно, есть различия в размере структуры, поэтому ваша подпись PInvoke становится неверной. Это может легко вызвать переполнение буфера и привести к повреждению стека в машинном коде.

0
ответ дан 6 December 2019 в 02:23
поделиться

Я столкнулся с аналогичной проблемой при переходе на win7. Возможно, вам потребуется настроить ваш (64-разрядный) компьютер для работы по умолчанию как 32-разрядный, используя следующую команду:

C: \ WINDOWS \ Microsoft.NET \ Framework64 \ v2.0.50727 \ Ldr64.exe setwow

Ссылка: http://social.msdn.microsoft.com/Forums/en/phoenix/thread/9a43e9a1-a744-4a1a-bb34-3604254c126b

-2
ответ дан 6 December 2019 в 02:23
поделиться

Если вы получаете сообщение об ошибке в своем приложении C #, это сообщение часто указывает на то, что собственный код сделал что-то неприятное с памятью, которую может увидеть ILM - проверьте код в / вызванный вашей подпрограммой DllMain - который вызывается до того, как ваш вызов действительно будет выполнен - ​​если он работает некорректно, вы увидите следующий результат

0
ответ дан 6 December 2019 в 02:23
поделиться

Очевидным, но, вероятно, неубедительным решением было бы явно создать сторону C # для 32-битной версии. Проверьте, как вы создаете хост вне процесса - программно или путем заполнения ключей реестра или ... может быть, в другом поле он настроен либо на выполнение 64-битного хостинга, либо на попытку вызова в процессе, что означает загрузку .. Это параметр реестра, не забывайте, что для смешанных 23/64 битных случаев есть две ветки, в которые нужно копаться.

0
ответ дан 6 December 2019 в 02:23
поделиться

@Merlyn Morgan-Graham Мы столкнулись с похожей проблемой. Где мы построили приложение .Net со сборкой "Any CPU" и пробовали использовать с 32-битной C ++ Dll. Когда мы запускаем приложение .Net в 64-битной ОС. Он работает как 64-битный исполняемый файл и, следовательно, имеет аналогичную проблему. После сборки в X86 Loading вызовы Dll C ++ работали абсолютно нормально. Еще одна важная вещь - если вы используете C ++ DLL в своем коде .Net. Маршалинга будет достаточно, поэтому важно придерживаться типа сборки (например, X86, любой ЦП или X64).

Также проверьте следующую ссылку: Windows Vista: невозможно загрузить DLL 'x.dll': недопустимый доступ к области памяти. (DllNotFoundException)

0
ответ дан 6 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: