2017-10-20 205 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

相關問題