SetDllDirectory не работает ( DllNotFoundException)

Я пытаюсь загрузить мои 32/64-битные нативные библиотеки DLL, используя тот же вызов DllImport.

Структура каталогов:

корень:

  • application.exe
  • / Win64 /
    • stb_image.dll
  • / Win32 /
    • stb_image.dll

Я пытался использовать это решение, но, как вы можете видеть, успехов нет.

Например, этот вызов функции:

[DllImport("stb_image.dll")]
private static extern IntPtr stbi_load(string filename, ref int x, ref int y, ref int n, int req_comp);

Но это не работает, так как я получаю DllNotFoundException.

То, как я использую SetDllDirectory:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        SetUnmanagedDllDirectory();

        GameConfiguration config = new GameConfiguration();
        config.FPSTarget = 60;
        config.FixedFPS = true;
        config.Resizable = false;

        TestGame game = new TestGame(config);
        game.Run();
    }

    public static void SetUnmanagedDllDirectory()
    {
        string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        path = Path.Combine(path, IntPtr.Size == 8 ? "win64 " : "win32");
        if (!SetDllDirectory(path)) throw new System.ComponentModel.Win32Exception();
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool SetDllDirectory(string path);
}

Это первый вызов в моей программе, поэтому он должен был установить правильный путь. Это также возвращает истину.

Но если я помещу (в моем случае) 64-битную нативную dll в директорию exe, то она будет работать, даже если я установлю DllDirectory по другому пути.

Любая помощь?

2 ответа

Что-то пошло не так с разработкой kernel32. Но есть обходной путь через установку переменной среды PATH для текущего сеанса процесса.

string dllFolder = "<somewhere>";

string path = Environment.GetEnvironmentVariable("PATH");
Environment.SetEnvironmentVariable("PATH", dllFolder + ";" + path);

После регистрации папки в переменной PATH, LoadLibrary работает безупречно и загружает Dll(s) по указанному пути.

[DllImport("SubDirectoryName/stb_image.dll")] private static extern IntPtr stbi_load(string filename, ref int x, ref int y, ref int n, int req_comp);

удачи

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