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

2

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

MyApp.exe
MyManagedDLL.dll
NativeDLL.dll

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

Использование DLLImport. blez
как управляемый dll знает о nativedll? sll
Он не загружает их во время выполнения. Он ссылается только на управляемые dll. blez
проект ссылается как на dll явно, так и на загрузку во время выполнения? sll

Ваш Ответ

1   ответ
2

что нужно искать в подкаталоге 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);
Спасибо, но я не хочу менять ПУТЬ пользователя. blez
Ну, это обычно довольно зло, но на самом деле не так уж много проблем в управляемом коде. Так как вы можете сами вызывать Environment.SetEnvironmentVariable ()before Вы называете любой метод pinvoked. Не сильно отличается от вызова SetDllDirectory ().
Это невозможно, данные конструктора атрибута хранятся в метаданных сборки. Также это не разумно, так как случайным образом произойдет сбой, если рабочий каталог приложения по умолчанию не установлен там, где вы надеетесь, что он установлен.
Да, я знаю. Может быть, вы знаете какой-то инструмент, с помощью которого я могу изменить строку DLLImport на «myDir \ some.dll» из скомпилированной сборки? blez

Похожие вопросы