我有一个 C# 应用程序,它可以在 32 位和 64 位处理器上运行。我试图枚举给定系统上所有进程的模块,当尝试从 64 位应用程序枚举 32 位进程模块时,这会出现问题;Windows 或 .NET 禁止它。
我认为如果我可以从内部重新启动应用程序会非常酷,但强制它以 32 位运行,然后它会正确枚举上次运行时错过的进程模块。
如何以编程方式运行可执行文件并指示即使它是使用ANY CPU
配置构建的,它也应该作为 32 位进程运行?
下面的代码会抛出一个System.ComponentModel.Win32Exception
带有文本“A 32 bit processes cannot access modules of a 64 bit process”的信息。
[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);
}
//}
}
}
}
}
}