在常规PowerShell窗口中,可以确定当前shell是x64还是x86 by examining the boolean environment variable [Environment]::Is64BitProcess
。
现在我做了同样的事情,但是来自.NET应用程序中的嵌入式PS会话。输出显示位数不是64位。
static void Main(string[] args)
{
using (PowerShell ps = PowerShell.Create())
{
foreach (var res in ps
.AddScript("$host.version.tostring()").AddStatement()
.AddScript("[Environment]::Is64BitProcess").AddStatement()
.Invoke())
{
Console.WriteLine(res.BaseObject);
}
// Outputs:
// 4.0
// False
}
}
使用corflags
和ildasm
,我确保引用的System.Management.Automation
DLL是v4.0和ILONLY
。即使我从x64 shell调用我的应用程序(例如,PowerShell.exe
x64),结果仍然表示Is64BitProcess == false
。任何提示?
这很重要,因为我想从嵌入式会话中Add-PsSnapin
。如果没有正确的位置,就无法加载SnapIn。
答案 0 :(得分:2)
好的,刚想通了。在项目属性中,如果我“强制”构建目标从Any CPU
到X64
,它就解决了问题。嵌入式PS会话正确显示位数为64位,并且所有已注册的管理单元都已正确列出。
我仍然不知道为什么Any CPU
无效。也许是因为Prefer 32-bit
选项默认选中Any CPU
复选框。
答案 1 :(得分:1)
这是猜测,但您可能在项目引用中使用了32位版本的PowerShell程序集。
确保引用64位版本的System.Management.Automation.dll
程序集。
在64位Windows安装中,您可以在此处找到程序集:
32位版本:
C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\[PS version installed]\System.Management.Automation.dll
64位版本:
C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll
答案 2 :(得分:0)
嵌入式PowerShell会话的位数跟随调用它的.NET进程的位数。
似乎没有办法(使用System.Management.Automation
)从64位父进程运行32位嵌入式PowerShell进程,反之亦然(尽管我很好奇,如果有的话)。
如果您将父进程强制为64位没有问题,并且您想知道它为什么以32位进程运行,可能的原因如下: