如題,近期在開發過程當中,須要調用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