Укажите путь поиска для атрибута DllImport in.NET
есть ли способ указать пути для поиска данной сборки, которая импортируется с DllImport?
[DllImport("MyDll.dll")]
static extern void Func();
это будет искать dll в приложении dir и в переменной среды PATH. Но иногда dll будет размещен в другом месте. Может ли эта информация быть указана в приложении.конфигурация или файл манифеста, чтобы избежать динамической загрузки и динамического вызова?
3 ответа:
вызов
SetDllDirectory
С дополнительными путями DLL перед первым вызовом импортированной функции.P / Invoke signature:
[DllImport("kernel32.dll", SetLastError = true)] static extern bool SetDllDirectory(string lpPathName);
чтобы задать более одного дополнительного пути поиска DLL, измените
PATH
переменной окружения, например:static void AddEnvironmentPaths(string[] paths) { string path = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; path += ";" + string.Join(";", paths); Environment.SetEnvironmentVariable("PATH", path); }
там больше информации о порядке поиска DLL здесь на MSDN.
Обновлено 2013/07/30:
обновление версия выше с помощью
Path.PathSeparator
:static void AddEnvironmentPaths(IEnumerable<string> paths) { var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? string.Empty }; string newPath = string.Join(Path.PathSeparator.ToString(), path.Concat(paths)); Environment.SetEnvironmentVariable("PATH", newPath); }
позвонить
AddDllDirectory
С дополнительными путями DLL перед первым вызовом импортированной функции.Если ваша версия Windows ниже 8 вам нужно будет установить этот патч, который расширяет API с отсутствующим
AddDllDirectory
функция для Windows 7, 2008 R2, 2008 и Vista (нет патча для XP, хотя).
Это может быть полезным DefaultDllImportSearchPathsAttribute Class
Е. Г.[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
также обратите внимание, что вы можете использовать AddDllDirectory так же, как вы ничего не испортить уже там:
[DllImport("kernel32.dll", SetLastError = true)] static extern bool AddDllDirectory(string path);