繁体   English   中英

如何以32位或64位配置以编程方式运行任何CPU .NET可执行文件?

[英]How can I run an ANY CPU .NET executable programmatically in either 32-bit or 64-bit configurations?

我有一个C#应用程序,可以在32位和64位处理器上运行。 我试图枚举给定系统上所有进程的模块,这在尝试从64位应用程序枚举32位进程模块时会出现问题; Windows或.NET禁止它。

我认为如果我可以从内部重新启动应用程序,但强制它以32位运行,然后它会正确枚举它在上次运行时遗漏的进程模块,那将是非常酷的。

如何以编程方式运行可执行文件并指示即使它是使用ANY CPU配置构建的,它也应该作为32位进程运行?

下面的代码抛出System.ComponentModel.Win32Exception ,文本“32位进程无法访问64位进程的模块”。

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
     [In] IntPtr hProcess,
     [Out] out bool lpSystemInfo);

private static void Main()
{
  Process[] processes = Process.GetProcesses();

  using (FileStream fileStream = new FileStream("ProcessModulesDump.dat", FileMode.Create, FileAccess.Write, FileShare.None))
  {
      using (GZipStream gzipStream = new GZipStream(fileStream, CompressionLevel.Optimal))
      {
          using (TextWriter writer = new StreamWriter(gzipStream))
          {
              foreach (Process process in processes)
              {
                  writer.WriteLine("{0} - {1}", process.Id, process.ProcessName);

                  //bool lpSystemInfo;
                  //if ((Environment.Is64BitProcess && 
                         IsWow64Process(process.Handle, out lpSystemInfo)) ||
                         (!Environment.Is64BitProcess &&
                          !IsWow64Process(process.Handle, out lpSystemInfo)))
                  //{
                      foreach (ProcessModule module in process.Modules)
                      {
                          writer.WriteLine("\t{0} - {1} ({2})", 
                              module.BaseAddress, 
                              module.ModuleName, 
                              module.FileName);
                      }
                  //}
              }
          }
      }
  }
}

根据Rick Byer的文章, AnyCPU Exes通常比它们的价值更麻烦 ,用于启动AnyCPU应用程序的“bitness”的决定是由OS加载程序决定的,你在此事上没有任何发言权。

特别:

AnyCPU EXE稍微复杂一些,因为OS加载程序需要决定如何初始化该过程。 在64位操作系统上,它们作为64位进程运行(除非'ldr64'主操作系统交换机另有说明),而在32位操作系统上,它们作为32位进程运行。

因此,看起来您最好的选择是创建并启动第二个32位exe并启动它。

通过它的外观你的问题是当它不可用/不合适时发出IsWow64Process调用....尝试用这段代码进行检测:

当您通过它时,您可以探索以平台无关的方式列出32位和64位进程模块的方法:

使用WMI(Windows Management Instrumentation)查询所需信息...请参阅提及UseWMIToGetProcesses ()的第3篇文章。

使用EnumProcessModulesEx (在Vista中支持...当您检测到您处于64位模式时),因为它可以枚举32位和64位进程列表(请参阅此链接的末尾):

使用CreateToolhelp32Snapshot枚举进程(在定义结构时必须小心):

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM