REGSVR32 Запрос. Модуль "xxxxx.dll" не удалось загрузить

У меня проблема с регистрацией *.dll под Windows 7 x64.

Я попытался поместить *.dll в обе папки: C:/Windows/System32 и C:/Windows/SysWOW64 и попытаться зарегистрироваться в "regsvr32 xxxxx.dll" в командной строке с повышенными привилегиями. Я также пытался зарегистрировать его из отдельного каталога. Он отвечает следующей ошибкой:

The module "xxxxx.dll" failed to load.
Make sure the binary is stored at the specified path or debug it to check for problems with the binary or dependent .DLL files.
The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail.

EventLog отмечает:

Activation context generation failed for "C:\(path-to-dll)
Dependent Assembly
Microsoft.VC90.ATL,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" could not be found.
Please use sxstrace.exe for detailed diagnosis

Примечание: я установил распространяемые файлы Microsoft Visual C++ 2010 для x86 и x64.

Интересно отметить, что я попытался зарегистрировать ту же *.dll на своем рабочем компьютере с 64-разрядной операционной системой Windows 7, и она была зарегистрирована, как и ожидалось. Я предполагаю, что это связано с тем, что отсутствует какая-то зависимость от C++ / связанная с ATL?

Если бы кто-нибудь мог помочь направить меня в правильном направлении или пролить дополнительный свет на этот вопрос; Я был бы более чем благодарен.

С уважением.

5 ответов

Решение

Это почти наверняка из-за отсутствия зависимости. Используйте инструмент, такой как Dependency Walker, чтобы найти необходимые зависимости DLL. Или, если DLL поставляется третьей стороной, прочитайте их документацию, в которой должны быть указаны необходимые зависимости.

Обратите внимание, что Microsoft.VC90.ATL указывает версию 9 MSVC, которая является VS2008. Поэтому вам нужно будет установить среду выполнения MSVC 2008, чтобы удовлетворить эту зависимость. Похоже, вы установили среду выполнения MSVC 2010 по ошибке.

Наконец, пожалуйста, не помещайте файлы в системный каталог. Он принадлежит системе и не должен изменяться вами.

Зависимая сборка Microsoft.VC90.ATL,processorArchitecture="x86"

Это указывает на отсутствие модуля времени выполнения Visual C++ (см. Библиотеки Visual C++ как общие параллельные сборки). Он доступен в виде распространяемого установщика (вероятно, он вам нужен; x86 вариант), который необходимо установить перед регистрацией вашей DLL (которая, в свою очередь, зависит от отсутствующего компонента).

Есть и еще одна причина, почему это не удается. Я просто столкнулся с этим сам. Я использовал методы API, которые не поддерживают Windows 7, такие какPathCchRemoveFileSpec который мне пришлось обновить до старшего, устарелPathRemoveFileSpec, Я использовал Dependency Walker, чтобы убедиться, что это было причиной. Зависимость Уокера лжет немного. Если вы посмотрите на мой скриншот (ниже), красный раздел показывает реальную проблему - методы, которые он не смог решить в DLL, которые он имеет, и т. Д. - но синий показывает DLL, которые на самом деле не являются проблемой (эти DLL существуют). Поскольку Dependency Walker настолько стар, он немного лжёт (устарел, думает, что время от времени что-то недоступно), но обычно он также говорит правду... вам просто нужно немного прокрутить сверху вниз левая панель, как я сделал. Примечание для себя: пожалуйста, прокрутите вниз в следующий раз. В любом случае, как только я бросил pathcch.h, все работало на 7. Счастливое кодирование.

Я получил освобождение от этого сообщения об ошибке. В моем двоичном пути у меня был SPACE, Просто заменил SPACE с UNDERSCORE(_), Это сработало для меня.

Поскольку я также столкнулся с той же проблемой при регистрации x.dll через Regsvr32, есть одна из возможных причин, что x.dll может быть неповрежденным DLL. Чтобы использовать неуправляемую функцию экспорта dll в коде dot net, вы должны использовать Dllimport,

Другие вопросы по тегам