我有一個C#應用程序,可以在32位和64位處理器上運行。我試圖枚舉給定系統上所有進程的模塊,當嘗試枚舉來自64位應用程序的32位進程模塊時,這會變得有問題; Windows或.NET禁止它。如何在32位或64位配置中以編程方式運行ANY CPU .NET可執行文件?
我認爲如果我可以從本身重新啓動應用程序,但強制它以32位運行,然後它會正確枚舉它在最後一次運行時錯過的過程模塊,這將非常酷。
如何以編程方式運行可執行文件並指出即使它是使用ANY CPU
配置構建的,它應該作爲32位進程運行?
下面的代碼將文本「32位進程無法訪問64位進程的模塊」引發System.ComponentModel.Win32Exception
。
[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);
}
//}
}
}
}
}
}
向我們展示您用來枚舉過程的代碼,並告訴我們您收到的錯誤消息的準確措辭。 –
你可以通過啓動一個32位的助手可執行文件來解決這個問題嗎?它可以加載並運行真正的可執行文件,就像它是一個庫一樣? – hvd
@ hvd的確我可以。我想避免使用兩個可執行文件,並且認爲如果您可以在啓動過程中設置某種選項來指示它應該被強制以32位運行時,它會很整潔。 –