Why
最近在公司开发的时候,发现很多时候需要引用不同的
dll,都是放在不同的文件夹中,然后在App.config里设置类似如下格式
<!--指定加载程序集时公共语言运行时搜索的子目录, 其中privatePath是相对于*.exe.config文件的相对路径,多个文件夹以分号分隔。-->
<probing privatePath="3dparty\OCCT;3dparty\TouchDevice;3dparty\Lib;3dparty\AvalonDock;3dparty\Dev;3dparty\CCDVision" />
这个方法其实很多时候是有用的,如何设置可以看我之前的博客:CSharp添加dll文件夹-祈安千,但是可能是框架相关的情况,目前公司的项目这种方法其实是失效的,本人踩坑了一天,终于发现是这个的问题,最后找到设置环境变量的终极解决办法,可涵盖几乎所有的场景。
How
在程序开启最开始调用函数:
PrependNativeDllSearchPaths,以下是代码:
private static void PrependNativeDllSearchPaths()
{
string baseDir = AppDomain.CurrentDomain.BaseDirectory.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
var prepend = new List<string>();
foreach (string relative in new[] { @"3dParty\Pcl", @"3dParty\OCCT", @"3dParty\Common" })
{
string full = Path.Combine(baseDir, relative);
if (Directory.Exists(full))
{
prepend.Add(full);
}
}
if (prepend.Count == 0)
{
return;
}
string tail = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
Environment.SetEnvironmentVariable("PATH", string.Join(Path.PathSeparator.ToString(), prepend) + Path.PathSeparator + tail);
}
这种方法只是一种设置临时环境变量的方法,放心在程序退出的时候不会影响你的任何本地的运行环境,可以放心的使用,基于这种方法,其实可以拓展出你想要的基本任何包含库。
Tips
学无止境~
评论区