CScript在c#中作为进程调用时,仅打开32位版本
我正在运行一个VBS文件,该文件需要在64位版本的cscript上执行。在命令行上,当我调用cscript时,它会打开位于CScript在c#中作为进程调用时,仅打开32位版本,c#,vbscript,process,64-bit,C#,Vbscript,Process,64 Bit,我正在运行一个VBS文件,该文件需要在64位版本的cscript上执行。在命令行上,当我调用cscript时,它会打开位于C:\Windows\System32\cscript.exe的64位版本,VBS文件工作正常 但是,我想通过C#调用这个VBS文件作为一个进程。以文件名cscript启动进程会打开cscript,但只会打开位于C:\Windows\SysWoW64\cscript.exe的32位版本 即使我将文件名设置为专门指向64位版本的cscript,它也只加载32位版本 如何强制进程
C:\Windows\System32\cscript.exe
的64位版本,VBS文件工作正常
但是,我想通过C#调用这个VBS文件作为一个进程。以文件名cscript
启动进程会打开cscript,但只会打开位于C:\Windows\SysWoW64\cscript.exe
的32位版本
即使我将文件名设置为专门指向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();
出现了一个简单的答案: 在我正在创建的C#应用程序中,在Visual Studio(2017)中,我选择了我的
平台目标
,以首选32位
,这或许应该称为“强制32位”
通过取消选择此选项,我的进程以64位的方式运行,既可以将64位路径指定为上面的代码,也可以只按名称运行cscript
process.StartInfo.FileName = "cscript";
在“属性>构建>首选32位”中切换此选项。根据您的要求,还有另一种解决方案 一些背景:运行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位,代码>也应该可以工作
注意,64位环境中不存在文件夹%windir%\Sysnative\
,因此您可以通过environment.is64位进程检查运行环境,因此
if Environment.Is64BitProcess {
process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe";
} else {
process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe";
}
另见
注意,注册表中也存在类似的机制,请参见您可以选择自己的评论作为答案,这样人们就不会一直看它是否得到了回答。很好,更具体的答案。随着VisualStudio在每个发行版中围绕其选项进行调整,记录在案很好。非常感谢。