2014-10-18 3 views
0

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

Мое приложение:

A C# программа развернута с установщиком Setup.msi. Внутри установщика находятся библиотеки DLL, которые размещаются в каталоге установки приложения. Пример:

OUTDIR = c:\Program Files\MyApplicationName\%OUTDIR%\MyApplication.exe 
dir %OUTDIR%\DLL_FOLDER\\*.dll 

MyDLL.dll применение

C# вызовы LoadLibrary определяется:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern IntPtr LoadLibrary(string libname); 

Так в основном

intPtr dll_handle = LoadLibrary("myDll.dll"); 

Называется и мы используем dll_handle для вызовите нужные функции.

До сих пор это работало на 5/7 машинах, на которых я его развернул ... Каковы очевидные ошибки, которые я здесь делаю? :-)

Благодарен за любую помощь!

+3

Обычно это проблема зависимости DLL. Проконсультируйтесь с зависимым ходоком, есть ли у DLL все, что от него зависит. – Timbo

+0

Является ли 'DLL_FOLDER' в пути поиска для DLL как-то? Если нет, почему вы не можете просто поместить DLL в '% OUTDIR%' непосредственно? – PeterT

+0

@PeterT: Да, Питер, я мог бы просто поместить его в ту же папку. DLL_FOLDER использовался, чтобы «держать вещи аккуратными». –

ответ

6

Наиболее вероятные объяснения:

  1. DLL, не может быть найден. Поскольку вы не указываете полный путь, вы полагаетесь на Dynamic-Link Library Search Order, чтобы найти его. Размещение DLL в том же каталоге, что и исполняемый файл, является обычным способом убедиться, что вы можете его найти, и найти нужную версию.
  2. DLL имеет несогласованность. Например, у вас есть 64-битный процесс и 32-битная DLL, или наоборот.
  3. DLL найден и имеет правильную битту, но зависимости DLL не могут быть разрешены. Обычно это означает, что на целевой машине должно быть установлено соответствующее время выполнения MSVC.

Первый шаг диагностики принять это проверить возвращаемое значение LoadLibrary и если это NULL затем вызвать GetLastError получить код ошибки. В п/ссылаться вы сделаете это так:

IntPtr lib = LoadLibrary(...); 
if (lib == IntPtr.Zero) 
    throw new Win32Exception(); 

Вы можете использовать инструмент, как Dependency Walker для отладки проблемы в дальнейшем.

+0

Хефферман, спасибо за подробный ответ! Я уверен в точках 1 и 2, хотя я подозреваю, что это может быть что-то относительно времени выполнения MSVC, как вы предполагали. С помощью ходячего зависимостей я обнаружил, что иногда сбойная DLL зависит от MSVCP100.DLL, MSVCR100.DLL, VCOMP100.DLL и kenerl32.dll. Я подозреваю, что первые 3 связаны со временем выполнения VS? –

+0

О, также, если я запустил хост зависимостей на одной из моих отказоустойчивых машин, сможет ли он сказать мне, какая зависимость отсутствует на этих машинах? –

+0

Действительно, VCOMP100.dll отсутствует на целевой машине в зависимости от пользователя dependencywalker, каков наилучший способ действий? Установить время выполнения VS2010 на каждой машине развертывания? –

Смежные вопросы