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

时间:2017-10-20 18:20:43

标签: c# vbscript process 64-bit

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

但是,我想通过C#将此VBS文件称为进程。使用FileName作为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();

2 个答案:

答案 0 :(得分:3)

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

某些背景信息:当您运行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\,即使您将应用程序编译为32位,process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe";也应该有效。

注意,文件夹%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

答案 1 :(得分:0)

出现了一个简单的答案:

在我创建的C#应用​​程序中,我在Visual Studio(2017)中选择了我的Platform targetPrefer 32-bit,这应该更好地称为"强制32位"

通过取消选择此选项,我的进程以64位运行,既指定64位路径作为上面的代码,又通过名称运行cscript。

process.StartInfo.FileName = "cscript";

在“属性”>中切换此选项构建>首选32位