在哪些路徑搜索的順序實際上是註冊表相關的,所以簡單地通過環境變量PATH列舉不能保證產生預期的結果,特別是在有在當前工作目錄中的一個期望的名稱的文件。要可靠地獲取可執行文件路徑,您需要在Kernel32中調用SearchPath
Win32函數。
沒有框架.NET函數公開SearchPath
,但該函數可以通過P/Invoke直接調用。
以下示例程序演示了此函數的用法。如果notepad.exe存在於系統搜索路徑中,則根據系統配置,它將打印路徑;如果它不存在,它將打印「找不到文件」。
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program
{
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint SearchPath(string lpPath,
string lpFileName,
string lpExtension,
int nBufferLength,
[MarshalAs (UnmanagedType.LPTStr)]
StringBuilder lpBuffer,
out IntPtr lpFilePart);
const int MAX_PATH = 260;
public static void Main()
{
StringBuilder sb = new StringBuilder(MAX_PATH);
IntPtr discard;
var nn = SearchPath(null, "notepad.exe", null, sb.Capacity, sb, out discard);
if (nn == 0)
{
var error = Marshal.GetLastWin32Error();
// ERROR_FILE_NOT_FOUND = 2
if (error == 2) Console.WriteLine("No file found.");
else
throw new System.ComponentModel.Win32Exception(error);
}
else
Console.WriteLine(sb.ToString());
}
}
來源
2015-10-27 01:01:12
drf
我相信它必須是[與dll相同的搜索順序](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29的.aspx#standard_search_order_for_desktop_applications)。 – GSerg
@Gserg中,['SearchPath'文檔】(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365527(V = vs.85)的.aspx)指示「的搜索順序'SearchPath'函數不同於'LoadLibrary'函數使用的搜索順序。「 – drf