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()
звонок был:
- Исполнительный каталог
- Каталог System32
- Системный каталог (16 бит)
- Каталог Windows
- Текущий каталог ("E:\foobar")
- Все мои каталоги $PATH
Это показывает, что он подчиняется "безопасному" порядку поиска, поскольку текущий каталог № 5, а не № 2, как если бы SafeDllSearchMode был отключен. Затем я добавил HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
значение реестра и установите его 1 (отключено), и снова запустил мой инструмент тестирования. Путь поиска тогда был фактически таким же. Я не знаю, испортил ли я добавление ключа реестра или нет, но на самом деле единственная важная вещь, которую я хотел знать, это то, что по умолчанию он следовал по "безопасному" пути поиска - что означает, что текущий каталог не ' т #2 в порядке.