我正在动态加载一个 .NET 程序集,该程序集依赖于位于不同文件夹中的几束本机.dll。但是,只有在我的应用程序启动时,这些 DLL 的文件夹位于 PATH 环境变量中,Windows 才会找到这些 DLL。
我想从我的程序中修改我的 PATH 变量以允许找到必要的库。根据 MSDN, “搜索顺序如下:... PATH 环境变量中列出的目录。”
使用 PATH 环境变量的哪个实例?
每个进程都有一个实例。
我试过了,Environment.SetEnvironmentVariable("PATH", ...)
但没有帮助。我还尝试了
SetDefaultDllDirectories()
和
AddDllDirectory() ,
但这些也没有区别。
症状是%PATH%
在启动我的 .exe时包含必要的文件夹(从 CMD 提示 - 它是一个控制台应用程序),ProcessMonitor 显示在所有 PATH 文件夹中探测到本机 .dll,并最终被找到。
但是当启动时%PATH%
不包含必要的文件夹时,则仅在 .exe 文件夹和 SYSTEM32 中探测本机 .dll(尽管%PATH%
包含更多),而不管上述 SetEnvironmentVariable()/SetDefaultDllDirectories() /AddDllDirectory() 调用。
这是怎么回事?我究竟做错了什么?为什么我不能有效地调整我的流程的 PATH ?
注意:AppDomain.AssemblyResolve 事件无法帮助我,因为当本机 .dll 加载其他本机 .dll 时不会触发它。
我想创建一个子查询,它产生一个数列列表作为单列结果,像MindLoggedOut这样做但没有@x
xml变量,因此它可以WHERE
作为纯字符串(子查询)附加到表达式而不带sql参数.问题是参数(或变量)的替换使查询运行速度慢5000倍,我不明白为什么.是什么导致这种巨大差异?
例:
/* Create a minimalistic xml like <b><a>78</a><a>91</a>...</b> */
DECLARE @p_str VARCHAR(MAX) =
'78 91 01 12 34 56 78 91 01 12 34 56 78 91 01 12 34 56';
DECLARE @p_xml XML = CONVERT(XML,
'<b><a>'+REPLACE(@p_str,' ','</a><a>')+'</a></b>'
);
SELECT a.value('(child::text())[1]','INT')
FROM (VALUES (@p_xml)) AS t(x)
CROSS APPLY x.nodes('//a') AS x(a);
Run Code Online (Sandbox Code Playgroud)
这将返回一个数每行和是相当快的(不是字符串分离器更快20X办法我用到目前为止,类似 于 这些.我测量的SQL服务器CPU时间上20倍的加速,与@p_str
含有3000号).
现在,如果我@p_xml
将查询的内容内联到:
SELECT a.value('(child::text())[1]','INT')
FROM (VALUES (CONVERT(XML,
'<b><a>'+REPLACE(@p_str,' ','</a><a>')+'</a></b>'
))) AS t(x) …
Run Code Online (Sandbox Code Playgroud)