C# 如何以32位或64位配置以编程方式运行任何CPU.NET可执行文件?
我有一个C#应用程序,可以在32位和64位处理器上运行。我试图枚举给定系统上所有进程的模块,当试图枚举64位应用程序中的32位进程模块时,这会产生问题;Windows或.NET禁止它 我认为如果我可以从应用程序内部重新启动它,但强制它以32位运行,然后它将正确地枚举上次运行时错过的流程模块,那将是非常酷的 如何以编程方式运行可执行文件,并指出即使它是使用C# 如何以32位或64位配置以编程方式运行任何CPU.NET可执行文件?,c#,.net,C#,.net,我有一个C#应用程序,可以在32位和64位处理器上运行。我试图枚举给定系统上所有进程的模块,当试图枚举64位应用程序中的32位进程模块时,这会产生问题;Windows或.NET禁止它 我认为如果我可以从应用程序内部重新启动它,但强制它以32位运行,然后它将正确地枚举上次运行时错过的流程模块,那将是非常酷的 如何以编程方式运行可执行文件,并指出即使它是使用任何CPU配置构建的,它也应该作为32位进程运行 下面的代码抛出一个带有文本“32位进程无法访问64位进程的模块”的System.Compone
任何CPU
配置构建的,它也应该作为32位进程运行
下面的代码抛出一个带有文本“32位进程无法访问64位进程的模块”的System.ComponentModel.Win32Exception
根据Rick Byer的文章,关于用于启动任何CPU应用程序的“比特数”的决定是由OS加载器决定的,您在这件事上没有任何发言权 具体而言: 由于操作系统加载程序需要 决定如何初始化流程。在64位操作系统上,它们作为 64位进程(除非“ldr64”主操作系统交换机另有说明), 在32位操作系统上,它们作为32位进程运行
因此,您的最佳选择似乎是创建并启动第二个32位exe并启动它。从外观上看,您的问题在于在调用不可用/不合适时发出
iswow64进程
调用……尝试使用此代码进行检测:
usewmitogetprocesss
()
EnumProcessModulesEx
(在Vista以后的版本中受支持…当您检测到自己处于64位模式时),因为它可以枚举32位和64位进程列表(请参阅此链接的最后部分):
CreateToolhelp32Snapshot
枚举进程(定义结构时必须小心):
[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);
}
//}
}
}
}
}
}