2013-10-02 3 views
1

Я сделал заявку в vs2010 (.net 4.0). Я опубликовал его, используя издатель и InstallShield LE.dll не найден (не COM-объект)

Но когда я запускаю приложение, я получаю ошибку, что dll не найден. Я знаю, какая DLL отсутствует. Это не COM-объект, и я не могу добавить его в свой проект в vs2010. Я использую библиотеку-оболочку, которая вызывает эту DLL.

Если я вставляю это dll в syswow64, мое приложение работает нормально. Но я хочу более чистый способ сделать это. Я уже посмотрел на ответ Ганса here. Но я не знаю, что такое бок о бок.

Добавление пути к переменным среды отлично работает.

Я не уверен, что обновление реестра и добавление значения пути будут работать или нет. Я хотел бы знать, могу ли я обновлять реестр для своего приложения и направлять путь, где он ищет определенные DLL.

Спасибо.

+0

Wller dll не мой личный код. Его управляемая версия неуправляемой библиотеки. Мне нужно вставить неуправляемые DLL в папку bin для работы отладчика. – Naresh

ответ

1

Изменение переменной PATH пользователя - это очень тяжелое решение, и вам следует избегать этого. Аналогично, не помещайте DLL в системный каталог. Это принадлежит системе и является конфиденциальной для вас.

Рекомендуемый способ решения проблемы - просто поместить DLL в тот же каталог, что и исполняемый файл. Сначала выполняется поиск каталога, в котором выполняется исполняемый файл, когда загруженный пытается найти библиотеки DLL. Это самое безопасное место для размещения ваших родных DLL.

Если по каким-то причинам вы не можете поставить DLL в каталоге исполняемых файлов, есть и другие варианты:

  • вызовов SetDllDirectory с каталогом вашей DLL, прежде чем сделать ваш первый п/ссылаться на вызов. Когда этот вызов будет возвращен, вызовите SetDllDirectory, перейдя NULL, чтобы восстановить стандартный порядок поиска DLL.
  • Сделать явный вызов LoadLibrary с полным путем вашей DLL перед тем, как сделать свой первый вызов p/invoke. После того, как DLL будет загружена, будущие вызовы p/invoke будут использовать загруженный модуль.
+0

большое спасибо. Пока я сработал, позже я рассмотрю более подробные сведения. – Naresh

0

Если вы знаете имя DLL заранее, есть простой способ.

Вы можете просто загрузить LoadLibrary для загрузки DLL из его известного местоположения (на основе, например, записи файла конфигурации).

Пока вы успешно вызываете LoadLibrary до того, как какой-либо из методов DLL будет использован, это будет успешным, поскольку DLL уже загружена.

Это работает, потому что вы можете LoadLibrary с полным путем, и как только это будет сделано, последующие вызовы LoadLibrary только с именем файла будут успешными сразу же, поскольку библиотека уже загружена.

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