У меня есть приложение.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++.
Основываясь на приведенной выше информации, кто-нибудь может помочь мне определить, что не удается?
Я был бы рад предоставить дополнительную информацию, пожалуйста, спросите, и я поставлю ее.
Заранее спасибо за вашу помощь.
Поэтому, если кто-то сталкивается с чем-то похожим, надеюсь, мой опыт может помочь.
Вот как я решил проблему. (СОВЕТ: Установите DependencyWalker на машине, которая дает вам проблему, и пройдите.dll, с которой вы столкнулись. DependencyWalker покажет недостающие зависимости или несоответствия CPU в Red).
Я знал, что приложение работает на компьютере А. Я знал, что одно и то же приложение не выполнено на компьютере Б.
Сообщение об ошибке было указано, что "указанный модуль не найден". Я был сосредоточен на фактическом.dll.
В REALITY ошибка не была связана с тем, что она не могла найти.dll. Скорее, это был тот факт, что он не мог найти зависимость, на которую ссылался Procwarper.dll. В этом случае именно:
MSVCP120D.DLL и MSVCR120D.DLL
Чтобы определить № 3, я использовал dependencywalker (www.dependencywalker.com). Поскольку я знал, что.dll был 32-битным, я установил 32-разрядную версию зависимого пользователя.
Я загрузил Procwarper.dll в dependencywalker на компьютере A (тот, где работает приложение). У Dependencywalker не было проблем.
Я загрузил dependencywalker на компьютер B (где приложение не работает). DependencyWalker показал две отсутствующие зависимости (две приведенные выше).
Я скопировал их из папки Windows\System32 компьютера A в компьютер B APP FOLDER
Я перерабатываю зависимость. Теперь он теперь показал отсутствие зависимостей, но у меня все еще была ошибка, потому что.dll в System32 64-разрядная.
Я сделал быстрый google и узнал, что папка SysWow64 содержит 32-разрядные версии этих системных библиотек System32.
Я скопировал эти два до компьютера B, и все сработало. Скопировать в ПАПКУ APP
Невероятно. Теперь я знаю, почему они называют это ".dll hell".
Надеюсь, это помогает кому-то.