DllImport подчиняется SafeDllSearchMode при поиске DLL?

Допустим, у меня есть типичный неуправляемый вызов, который я хочу сделать в некоторой DLL:

[DllImport("unmanaged.dll")]
static extern int SomeFuncion1(int parm);

Выполняет ли DllImportAttribute поиск DLL в соответствии с параметром SafeDllSearchMode в реестре? Я не смог найти в MSDN ничего, что указывало бы, действительно ли порядок поиска соответствует "стандартному порядку поиска".

2 ответа

Решение

Да, маршаллер P/Invoke просто использует LoadLibrary(). Который наблюдает за настройкой. Это недоказуемо, что на самом деле это происходит в SO посте, пока вы сами не попробуете, я пришел к выводу, что уверен, что разумной альтернативы нет. LoadLibrary прямо относится к категории "сложных" API-функций.

Между прочим, он никогда не найдет ту DLL с вашим объявлением [DllImport]. У неуправляемых DLL просто есть путь, у них нет свойств управляемой сборки, таких как версия, культура, pkt. Если это на самом деле управляемая сборка с этими свойствами, то вы загружаете ее с помощью Assembly.Load(). Но вам будет трудно вызывать статическую функцию, CLR не поддерживает это, каждый метод должен принадлежать классу.

Используйте Dumpbin.exe /exports на этой DLL, чтобы узнать, что на самом деле экспортируется из этой DLL.

О, хорошо, я был нетерпелив и ответил на это самостоятельно, но Ганс ответил на это тем временем.

Сначала я создал тестовый инструмент:

[DllImport("SomeDllThatDoesntExist.dll")]
public static extern void Test();

static void Main()
{
     string currentWorkingDirectory = Directory.GetCurrentDirectory();
     Console.WriteLine(currentWorkingDirectory);
     Directory.SetCurrentDirectory("E:\\foobar");
     currentWorkingDirectory = Directory.GetCurrentDirectory();
     Console.WriteLine(currentWorkingDirectory);
     // Call method in DLL we know doesn't exist.
     Test();
}

Затем я проверил это с помощью Procmon, и порядок поиска пути на Test() звонок был:

  1. Исполнительный каталог
  2. Каталог System32
  3. Системный каталог (16 бит)
  4. Каталог Windows
  5. Текущий каталог ("E:\foobar")
  6. Все мои каталоги $PATH

Это показывает, что он подчиняется "безопасному" порядку поиска, поскольку текущий каталог № 5, а не № 2, как если бы SafeDllSearchMode был отключен. Затем я добавил HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode значение реестра и установите его 1 (отключено), и снова запустил мой инструмент тестирования. Путь поиска тогда был фактически таким же. Я не знаю, испортил ли я добавление ключа реестра или нет, но на самом деле единственная важная вещь, которую я хотел знать, это то, что по умолчанию он следовал по "безопасному" пути поиска - что означает, что текущий каталог не ' т #2 в порядке.

Другие вопросы по тегам