Существует ли способ указать пути, которые будут искаться данный блок, который импортируется с DllImport?
[DllImport("MyDll.dll")]
static extern void Func();
Это будет искать dll в dir приложения и в переменной окружения PATH. Но время от времени dll будет помещен в другое место. Эта информация может быть указана в app.config или файле манифеста для предотвращения динамической загрузки и динамического вызова?
Вызовите SetDllDirectory
с дополнительными путями к DLL перед первым вызовом импортированной функции.
Сигнатура P / Invoke:
[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 .
Обновлено 30.07.2013:
Обновленная версия вышеуказанного с использованием 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);
}