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

相关文章
相关标签/搜索