Я использую 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)"}
У меня уже была такая проблема. Я думаю, что ваша проблема связана с тем, что VS пытается открыть файл, но не имеет прав на его чтение. Вам нужно убедиться, что используемая вами учетная запись имеет доступ к DLL. Попробуйте отключить UAC, чтобы проверить, работает ли это, или используйте учетную запись администратора. Или попробуйте дать Полный контроль
над DLL Всем
.
EDIT: Не могли бы вы запустить VS от имени администратора (правый клик -> Run As Administrator)? Не могли бы вы поместить DLL на рабочий стол, чтобы попробовать? Есть ли разница в структуре папок между вашим рабочим компьютером и тем, который не работает? Также, может ли DLL работать нормально, если вы запустите ее вне VS (попробуйте также запустить ее от имени администратора)?
HTH
.Загрузка DLL может завершиться сбоем из-за неразрешенных зависимостей, поэтому откройте свою DLL на целевой машине с помощью Dependency Walker и посмотрите, есть ли проблемы.
Я заметил один большая разница между вашей машиной разработчика и целевой машиной, средой разработки. Убедитесь, что на целевой машине есть все необходимые распространяемые файлы.
Изменить: я видел похожие проблемы, когда некоторые библиотеки DLL были скомпилированы в разные версии платформы .Net или если они были созданы с разными версиями Visual Studio, так как распространяемые файлы для каждой версии разные, а последние распространяемые файлы не совсем обратная совместимость.
У меня уже были подобные проблемы, попробуйте следующее.
Я столкнулся с проблемой с 64-битным .NET-приложением («Любой процессор») пытается загрузить 32-битную собственную зависимость DLL. Передо мной нет сообщения об ошибке, поэтому я не могу сказать вам, та же проблема. Решением моей проблемы было изменить мою сборку только на x86.
Если битовый размер DLL меняется на каждом блоке, возможно, есть различия в размере структуры, поэтому ваша подпись PInvoke становится неверной. Это может легко вызвать переполнение буфера и привести к повреждению стека в машинном коде.
Я столкнулся с аналогичной проблемой при переходе на 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
Если вы получаете сообщение об ошибке в своем приложении C #, это сообщение часто указывает на то, что собственный код сделал что-то неприятное с памятью, которую может увидеть ILM - проверьте код в / вызванный вашей подпрограммой DllMain - который вызывается до того, как ваш вызов действительно будет выполнен - если он работает некорректно, вы увидите следующий результат
Очевидным, но, вероятно, неубедительным решением было бы явно создать сторону C # для 32-битной версии. Проверьте, как вы создаете хост вне процесса - программно или путем заполнения ключей реестра или ... может быть, в другом поле он настроен либо на выполнение 64-битного хостинга, либо на попытку вызова в процессе, что означает загрузку .. Это параметр реестра, не забывайте, что для смешанных 23/64 битных случаев есть две ветки, в которые нужно копаться.
@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)