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


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

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

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

3 51

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);