C# DllImport 相對路徑沒法找到dll

原文: C# DllImport 相對路徑沒法找到dll

如題,近期在開發過程當中,須要調用C++的庫,通常來講,使用下面的方法便可正常調用:css

[DllImport("hci_sys.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int hci_init(string initConfig);

這個只要的須要的庫文件放到根目錄就能夠了,但若是啥文件都往根目錄放,那就顯得比較雜亂無章,並且很差維護,因此一般會創建不一樣的目錄放在不一樣的文件,這樣程序目錄結構就比較清晰。因此我就調整了目錄結構,而後從新調用C++的方法以下:html

[DllImport(@"\AsrSdk\Jths\hci_sys.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int hci_init(string initConfig);

把庫文件都放到了根目錄的相對路徑下面,按理說應該也能夠正常運行的,BUT,事情總不會按設定好的劇情發展,由於調用的C++ sdk自己包含多個C++的dll,我調用的這個接口是成功了,可是其內部又用到了它本身的dll,致使找不到它本身的dll,形成調用失敗。.net

查閱了不少資料,由於C++的代碼中,dll查找的的順序是,EXE目錄、Windows目錄和Windows\System32目錄以及環境變量設定的目錄都是搜索路徑之一,因此最後的解決辦法就是動態設置當前進程的環境變量,把sdk所在的目錄添加到環境變量中,這其內部就能夠找到本身的dll了:code

/// <summary>
    /// 添加環境變量
    /// </summary>
    /// <param name="paths">路徑列表</param>
    internal 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);   // 這種方式只會修改當前進程的環境變量
    }

記錄一下,便於查找。htm

相關文章
相關標籤/搜索