2

Вопрос по dll, .net – Как разделить управляемые и неуправляемые библиотеки DLL в другом каталоге

Моя папка выпуска:

MyApp.exe
MyManagedDLL.dll
NativeDLL.dll

MyApp использует управляемую dll, которая вызывает с помощью pinvoke нативную dll. Я попытался переместить их в другую папку подпапок и снова обратился к управляемой dll, когда я запускаю свое приложение, оно говорит, что не может найти NativeDLL.dll. Как это исправить?

  • Да, я знаю. Может быть, вы знаете какой-то инструмент, с помощью которого я могу изменить строку DLLImport на «myDir \ some.dll» из скомпилированной сборки?

    от blez
  • Это невозможно, данные конструктора атрибута хранятся в метаданных сборки. Также это не разумно, так как случайным образом произойдет сбой, если рабочий каталог приложения по умолчанию не установлен там, где вы надеетесь, что он установлен.

    от
  • Ну, это обычно довольно зло, но на самом деле не так уж много проблем в управляемом коде. Так как вы можете сами вызывать Environment.SetEnvironmentVariable ()before Вы называете любой метод pinvoked. Не сильно отличается от вызова SetDllDirectory ().

    от
  • Спасибо, но я не хочу менять ПУТЬ пользователя.

    от blez
  • как управляемый dll знает о nativedll?

    от sll
  • Он не загружает их во время выполнения. Он ссылается только на управляемые dll.

    от blez
  • проект ссылается как на dll явно, так и на загрузку во время выполнения?

    от sll
  • Использование DLLImport.

    от blez
  • 2

    Windows не знает

    что нужно искать в подкаталоге DLL. Он будет искать только в нескольких местах для DLL, начиная с папки, содержащей EXE. Подобные ситуации не очень продуктивны. Но вы можете помочь этому, вызвав SetDllDirectory (). Имейте в виду, что вашему пользователю все равно, где находится DLL. ИТ-отделы склонны отдавать предпочтение простым решениям, устранять проблемы с загрузкой DLL, когда само приложение изменяет путь поиска Windows, никогда не бывает весело.

    В противном случае это разумный способ разрешить запуск исполняемого файла AnyCPU как в 32-битном, так и в 64-битном режиме. Вы используетеtwo каталоги, одна с 32-битной версией DLL, другая с 64-битной версией. И, соответственно, вызывайте SetDllDirectory, основываясь на значении IntPtr.Size.

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern bool SetDllDirectory(string lpPathName);