Решение 1:
На первый взгляд, загрузка собственной нативной библиотеки dll перед загрузкой управляемой оболочки кажется хорошим решением (при использовании вызова LoadLibrary с абсолютным путем)
[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Ansi)]
static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
С docs.microsoft.com :
Если в строке указан полный путь, функция ищет только этот путь для модуля.
Я хочу поговорить и об альтернативе, которую я попытался с успехом.
Решение 2:
Мы можем добавить новый путь в порядок поиска LoadLibrary используя собственный API SetDllDirectory.
Собственные библиотеки загружаются с использованием функции LoadLibrary , и для загружаемых библиотек существует определенный порядок поиска каталогов .
См. Этот раздел, взятый из документации функции LoadLibrary:
Путь поиска можно изменить с помощью функции SetDllDirectory. Это решение рекомендуется вместо использования SetCurrentDirectory или жесткого кодирования полного пути к DLL.
Я добавил символический c вызов взаимодействия для несуществующего модуля:
[DllImport("oguzozgul.dll")]
static extern uint InvokeOguzOzgul(IntPtr oguz, uint ozgul);
Затем вызвал эту функцию и контролировал поведение поиска с помощью ProcMon
Вы можете ясно видеть, в каком порядке выглядит LoadLibrary для родного образа. (В моей системе)
И затем, перед любыми вызовами этого несуществующего модуля, я вызвал [SetDllDirectory]:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetDllDirectory(string lpPathName);
// Calling SetDllDirectory:
SetDllDirectory("c:\\temp\\");
И снова вызвал метод. Результат выглядит следующим образом.
Сразу после проверки папки процесса, LoadLibrary проверяет введенный путь.
Так что если вы вызываете SetDllDirectory и добавляете правильный путь к каталогу в порядок поиска LoadLibrary, требуемая версия собственной библиотеки DLL должна автоматически загружаться оттуда, когда этого требует управляемая оболочка.
Надеюсь, это поможет.