Укажите путь поиска для DllImport в .NET.
Есть ли способ указать пути для поиска для данной сборки, импортированной с помощью DllImport?
[DllImport("MyDll.dll")]
static extern void Func();
Это приведет к поиску dll в каталоге app и в переменной среды PATH. Но время от времени dll будет размещен в другом месте. Может ли эта информация указываться в файле app.config или манифеста, чтобы избежать динамической загрузки и динамического вызова?
Ответы
Ответ 1
Вызовите SetDllDirectory
с вашими дополнительными путями DLL, прежде чем вы SetDllDirectory
импортированную функцию в первый раз.
P/Invoke подпись:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);
Чтобы задать более одного дополнительного пути поиска DLL, измените PATH
среды 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);
}
Ответ 2
Попробуйте вызвать AddDllDirectory
с вашими дополнительными путями DLL перед первым вызовом импортированной функции.
Если ваша версия Windows ниже 8, вам необходимо установить этот патч, который расширяет API с отсутствующей функцией AddDllDirectory
для Windows 7, 2008 R2, 2008 и Vista (хотя для XP нет патча).
Ответ 3
Это может быть полезно DefaultDllImportSearchPathsAttribute Class
Например.
[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
Также обратите внимание, что вы можете использовать AddDllDirectory, так что вы уже ничего не жуете:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AddDllDirectory(string path);