2017-10-20 285 views
0

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

但是,我想通过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 = [email protected]"\VBS\"; 
process.StartInfo.Arguments = "scriptName.vbs"; 
process.Start(); 

回答

1

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

一些背景资料:当您运行64位应用程序,并尝试启动cscript.exe然后调用C:\Windows\System32\cscript.exe(或更一般%windir%\System32\cscript.exe

但是,当您运行32位应用程序,然后每次调用%windir%\System32\是自动重定向到%windir%\SysWOW64\。在这个目录中你可以找到你所有的32位DLL。此重定向由Windows内部完成,您的应用程序不会识别任何差异。

为了从您可以使用%windir%\Sysnative\ 32位应用程序访问%windir%\System32\,即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

+0

伟大的,更具体的答案,因为每个版本的Visual Studio都在各自的选项中进行混洗,所以最好记录下来,谢谢。 – user2494584

0

一个简单的答案已经出现了:

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

通过取消选择此选项,我的进程以64位方式运行,无论是通过指定上述代码的64位路径,还是通过按名称运行cscript。

process.StartInfo.FileName = "cscript"; 

拨动内部属性>生成此选项>身高32位

+0

你可以选择自己的答案评论所以人们不会继续查看是否回答。 –

+1

我可以“在两天内接受我自己的答案”(: – user2494584

相关问题