C#适用于32位但不适用于64位

时间:2012-06-27 15:10:53

标签: c# 64-bit 32-bit

下面的代码在我的32位机器上完美运行,但我现在已经在我的64位机器上测试了代码,我希望它可以正常工作,因为我正在调用64位版本的cscript.exe。

相反,代码到达运行脚本的程度,然后等待30秒,然后退出脚本并继续执行程序的其余部分。然而,该脚本似乎无法运行(如果我手动运行它会正常工作)。

   using (var ServerProcess = new System.Diagnostics.Process())
            {
                var fileInformation = new FileInfo(VBScriptToRun);
                string processFileName = IntPtr.Size == 8 ? @"c:\windows\sysWOW64\cscript.exe " : @"c:\windows\system32\cscript.exe ";
                string processWorkDir = IntPtr.Size == 8 ? @"c:\windows\sysWOW64\" : @"c:\windows\system32\";
                string processArguments = fileInformation.FullName;
                ServerProcess.StartInfo.FileName = processFileName;
                ServerProcess.StartInfo.WorkingDirectory = processWorkDir;
                ServerProcess.StartInfo.Arguments = processArguments;
                ServerProcess.StartInfo.CreateNoWindow = false;
                ServerProcess.StartInfo.UseShellExecute = false;
                ServerProcess.StartInfo.RedirectStandardOutput = true;
                ServerProcess.StartInfo.LoadUserProfile = true;

            EventLogger.Instance.WriteInformation("Total Integration Service Processing File:  Starting to launch the specified program");

            try
            {
                ServerProcess.Start();
                ServerProcess.WaitForExit();
            }catch(Exception e)
            {
            EventLogger.Instance.WriteInforamtion("Error running script: " + e)
            }

1 个答案:

答案 0 :(得分:4)

// Sample for the Environment.GetFolderPath method
using System;

class Sample 
{
    public static void Main() 
    {
    Console.WriteLine();
    Console.WriteLine("GetFolderPath: {0}", 
                 Environment.GetFolderPath(Environment.SpecialFolder.System));
    }
}
/*
This example produces the following results:

GetFolderPath: C:\WINNT\System32
*/

您不应该尝试访问作为32位Windows程序集位置的sysWOW64文件夹。由于您指出cscript.exe是64位进程,因此{7}安装上cscript.exe的位置将是System目录

来源:http://msdn.microsoft.com/en-us/library/system.environment.specialfolder

您还应该使用以下内容来确定操作系统是否为64位。

public static bool Is64BitOperatingSystem { get; }

http://msdn.microsoft.com/en-us/library/system.environment.is64bitoperatingsystem.aspx

我应该指出你当前的方法失败,因为它试图[基于缺乏信息这只是一个猜测]启动32位进程。 IntPtr.Size取决于流程而不是机器。

如果您想使用您的方法,您只能使用以下代码来执行此操作。

[DllImport("kernel32.dll", SetLastError=true)]
  [return:MarshalAs(UnmanagedType.Bool)]
  extern static bool IsWow64Process(IntPtr hProcess, [MarshalAs(UnmanagedType.Bool)] out bool isWow64);
  [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError=true)]
  extern static IntPtr GetCurrentProcess();
  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  extern static IntPtr GetModuleHandle(string moduleName);
  [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError=true)]
  extern static IntPtr GetProcAddress(IntPtr hModule, string methodName);

您可以使用

System.Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITECTURE" )

如果进程是32位进程,它将返回x86。

您最好使用.NET 4.0方法。

你也可以使用它:

public static bool Is64BitProcess { get; }

通过这种方式,您可以了解实际启动的cscript.exe。如果您的进程是64位,则只应与64位进程通信。如果它的32位然后只启动32位进程。

我相信Windows 7 x64可能会在SystemsysWOW64系统目录中保留多个版本。

如果进程实际上不是64位进程,那么它将不会位于64位安装的c:\windows\system32上。调查它[为什么我被迫研究这个而不是你? ] Environment.SpecialFolder.SystemX86将指向正确的位置。