Mam aplikację C#, która została zbudowana do pracy zarówno na procesorach 32-bitowych, jak i 64-bitowych. Próbuję wyliczyć moduły wszystkich procesów w danym systemie i staje się to problematyczne przy próbie wyliczenia 32-bitowych modułów procesowych z aplikacji 64-bitowej; Windows lub .NET zabrania tego.Jak można programowo uruchomić dowolny plik .NET .NET CPU w konfiguracji 32-bitowej lub 64-bitowej?
Pomyślałem, że byłoby całkiem fajnie, gdybym mógł ponownie uruchomić aplikację z poziomu samej siebie, ale zmusić ją do uruchomienia jako 32-bitowego, a następnie poprawnie wyliczy moduły procesowe, które przegapił podczas ostatniego uruchomienia.
Jak uruchomić programowo programowo i wskazać, że mimo że został on zbudowany z konfiguracją ANY CPU
, powinien działać jako proces 32-bitowy?
Poniższy kod zgłasza System.ComponentModel.Win32Exception
z tekstem "Procesy 32-bitowe nie mogą uzyskać dostępu do modułów procesu 64-bitowego."
[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);
}
//}
}
}
}
}
}
Pokaż nam kod, którego używasz do wyliczenia procesów, i podaj nam dokładną treść komunikatu o błędzie, który otrzymujesz. –
Czy możesz obejść problem, uruchamiając 32-bitowy plik wykonywalny pomocnika, który ładuje i uruchamia twój prawdziwy plik wykonywalny, tak jakby był biblioteką? – hvd
@hvd Rzeczywiście mogłem. Chciałem uniknąć dwóch plików wykonywalnych i pomyślałem, że byłoby zgrabnie, gdybyś mógł ustawić jakąś opcję w procesie, kiedy zaczynałby wskazywać, że powinien być zmuszony do uruchomienia jako 32-bitowy. –