如何在C#应用程序中将嵌入式PowerShell会话配置为64位

时间:2015-04-07 07:36:51

标签: .net windows powershell automation

在常规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
    }
}

使用corflagsildasm,我确保引用的System.Management.Automation DLL是v4.0和ILONLY。即使我从x64 shell调用我的应用程序(例如,PowerShell.exe x64),结果仍然表示Is64BitProcess == false。任何提示?

这很重要,因为我想从嵌入式会话中Add-PsSnapin。如果没有正确的位置,就无法加载SnapIn。

3 个答案:

答案 0 :(得分:2)

好的,刚想通了。在项目属性中,如果我“强制”构建目标从Any CPUX64,它就解决了问题。嵌入式PS会话正确显示位数为64位,并且所有已注册的管理单元都已正确列出。

enter image description here

我仍然不知道为什么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位进程运行,可能的原因如下:

  • 平台设置为" x86"
  • 平台设置为"任何CPU"和"首选32位"已检查
  • 平台设置为"任何CPU",父进程是从Visual Studio运行时在IIS Express中运行的Web应用程序。您可以在Visual Studio设置中更改此项(项目和解决方案> Web项目>使用64位版本的IIS Express ...)。请注意,在生产(常规IIS,Azure网站等)中,父进程可能默认以64位运行。