gpt4 book ai didi

c# - CScript 在 c# 中作为进程调用时仅打开 32 位版本

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:26 25 4
gpt4 key购买 nike

我正在运行一个需要在 64 位版本的 cscript 上执行的 VBS 文件。在命令行上,当我调用 cscript 时,它会打开位于 C:\Windows\System32\cscript.exe 的 64 位版本。并且 VBS 文件工作正常。

不过,我想通过C#调用这个VBS文件作为一个进程。使用文件名作为 cscript 启动进程确实打开 cscript,但只打开位于 C:\Windows\SysWoW64\cscript.exe 的 32 位版本.

即使我将 FileName 设置为专门指向 64 位版本的 cscript,它也只会加载 32 位版本。

如何强制进程打开 64 位版本的 cscript?

下面是我的代码,包括上面解释的64位版本文件路径:

string location = @"C:\location";
Process process = new Process();
process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe";
process.StartInfo.WorkingDirectory = location+@"\VBS\";
process.StartInfo.Arguments = "scriptName.vbs";
process.Start();

最佳答案

根据您的要求,还有另一种解决方案。

一些背景:当您运行 64 位应用程序并尝试启动 cscript.exe 时,您调用 C:\Windows\System32\cscript.exe(或更通用的 %windir%\System32\cscript.exe)

但是,当您运行 32 位应用程序时,每次对 %windir%\System32\ 的调用都会自动重定向到 %windir%\SysWOW64\。在此目录中,您将找到所有 32 位 DLL。此重定向由 Windows 内部完成,您的应用程序无法识别任何差异。

为了从 32 位应用程序访问 %windir%\System32\,您可以使用 %windir%\Sysnative\,即 process.StartInfo .FileName = @"C:\Windows\Sysnative\cscript.exe"; 即使您将应用程序编译为 32 位也应该可以工作。

注意,文件夹 %windir%\Sysnative\ 在 64 位环境中不存在,因此您可以通过 Environment.Is64BitProcess 检查您的运行环境,所以

if Environment.Is64BitProcess {
process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe";
} else {
process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe";
}

另见 File System Redirector

请注意,注册表也存在类似的机制,请参阅 Registry Redirector

关于c# - CScript 在 c# 中作为进程调用时仅打开 32 位版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46855084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com