Подтвердить что ты не робот

Укажите путь поиска для DllImport в .NET.

Есть ли способ указать пути для поиска для данной сборки, импортированной с помощью DllImport?

[DllImport("MyDll.dll")]
static extern void Func();

Это приведет к поиску dll в каталоге app и в переменной среды PATH. Но время от времени dll будет размещен в другом месте. Может ли эта информация указываться в файле app.config или манифеста, чтобы избежать динамической загрузки и динамического вызова?

4b9b3361

Ответ 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);