PInvoke - указанный модуль не найден. Как проверить наличие недостающих зависимостей?

0

У меня есть приложение.Net, которое полагается на неуправляемую DLL, называемую Procarper.dll. Когда я запускаю это на своей персональной машине, приложение работает отлично.

Когда я копирую это же приложение на свой сервер (Windows 2008) и пытаюсь запустить его там, он выходит из строя с приведенным ниже сообщением об ошибке.

Причина, по которой я тестирую фактическое приложение, заключается в том, что изначально я не работал в своей службе WCF.

System.DllNotFoundException: Не удается загрузить DLL 'C:\Warper\Procarper.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

Подпись PInvoke выглядит так (я жестко кодирую путь как тест... он обычно будет относительным):

[DllImport(@"C:\Warper\Procarper.dll", EntryPoint = "CreateProcr", CallingConvention = CallingConvention.Cdecl)]
        private static extern int CreateProcr(int width, int height, int scanWidth, int bpp, IntPtr rawData);

Я смотрю на зависимого игрока, но честно, я не знаю, как реально судить, что он говорит мне, что прошло очень много времени, так как мне пришлось работать с C++.

Основываясь на приведенной выше информации, кто-нибудь может помочь мне определить, что не удается?

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

Заранее спасибо за вашу помощь.

  • 0
    Я предполагаю, что вы скопировали procarper.dll в c: \ Warper на компьютере с проблемой?
  • 0
    Да, я сделал ... спасибо, что спросил. В конце концов я решил проблему (как обычно, через 5 минут после публикации).
Показать ещё 2 комментария
Теги:
dll
pinvoke

1 ответ

1

Поэтому, если кто-то сталкивается с чем-то похожим, надеюсь, мой опыт может помочь.

Вот как я решил проблему. (СОВЕТ: Установите DependencyWalker на машине, которая дает вам проблему, и пройдите.dll, с которой вы столкнулись. DependencyWalker покажет недостающие зависимости или несоответствия CPU в Red).

  1. Я знал, что приложение работает на компьютере А. Я знал, что одно и то же приложение не выполнено на компьютере Б.

  2. Сообщение об ошибке было указано, что "указанный модуль не найден". Я был сосредоточен на фактическом.dll.

  3. В REALITY ошибка не была связана с тем, что она не могла найти.dll. Скорее, это был тот факт, что он не мог найти зависимость, на которую ссылался Procwarper.dll. В этом случае именно:

MSVCP120D.DLL и MSVCR120D.DLL

  1. Чтобы определить № 3, я использовал dependencywalker (www.dependencywalker.com). Поскольку я знал, что.dll был 32-битным, я установил 32-разрядную версию зависимого пользователя.

  2. Я загрузил Procwarper.dll в dependencywalker на компьютере A (тот, где работает приложение). У Dependencywalker не было проблем.

  3. Я загрузил dependencywalker на компьютер B (где приложение не работает). DependencyWalker показал две отсутствующие зависимости (две приведенные выше).

  4. Я скопировал их из папки Windows\System32 компьютера A в компьютер B APP FOLDER

  5. Я перерабатываю зависимость. Теперь он теперь показал отсутствие зависимостей, но у меня все еще была ошибка, потому что.dll в System32 64-разрядная.

  6. Я сделал быстрый google и узнал, что папка SysWow64 содержит 32-разрядные версии этих системных библиотек System32.

  7. Я скопировал эти два до компьютера B, и все сработало. Скопировать в ПАПКУ APP

Невероятно. Теперь я знаю, почему они называют это ".dll hell".

Надеюсь, это помогает кому-то.

  • 0
    Вы поняли это неправильно. Вы не можете переустанавливать время отладки. Если вы хотите восстановить среду выполнения, используйте установщик для среды выполнения. Если вы хотите скопировать, просто освободите библиотеки DLL времени выполнения сборки, поместите их в каталог приложения. Не изменяйте системные директории. Они не принадлежат тебе.
  • 1
    Я не модифицировал никаких системных каталогов. Я скопировал недостающие сборки с компьютера A на компьютер B и поместил их в каталог приложения. На седьмом шаге я никогда не говорил, куда я скопировал их на компьютер B. Это не выпускаемый продукт, поэтому системные каталоги ДОЛЖНЫ принадлежать мне, так как я заплатил за компьютер и операционную систему. ;) Несмотря на это я ничего не изменил. .. просто скопированные файлы. Несмотря на это...
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню