2

我已经安装了 PowerShell v3 的发行版,但在使 -Version 参数正常工作时遇到了一些麻烦。我有很多需要 .NET 4.0 的模块,并且我一直在使用 PowerShell v2,使用以下 powershell.exe.config 文件没有问题:

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0.30319"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
    <runtime>
        <loadFromRemoteSources enabled="true"/>
    </runtime>
</configuration>

这将允许我使用 .NET 4.0 CLR 运行 PowerShell v2。一切正常。

我现在已经安装了 PowerShell v3 的发布版本,并且每当我使用命令“powershell -version 2”并检查$PSVersionTable变量时,它显示它已经加载了 PowerShell v3(使用 .NET 4.0)。如果我删除powershell.exe.config上面的文件并运行相同的命令,则表明 PowerShell v2 已加载但正在使用 .NET 2.0。

所以我的问题是:有没有办法像我在安装 PowerShell v3 之前那样加载 PowerShell v2 并让它使用 .NET 4.0 CLR?还是 PowerShell v3 不允许这样做?

另外,我应该提一下我为什么要这样做 - 主要是为了以防我们切换到 V3 时可能会出现任何不兼容问题。我计划使用 V3 测试所有内容,但是能够回退到 V2 可以让我们免于很多麻烦。

4

2 回答 2

5

发生的情况如下:

  • 从...开始-Version 2
  • Powershell 启动,绑定到 v2 运行时/程序集。到现在为止还挺好。
  • App.config 指示应加载 .NET 4 运行时
  • 随着程序集绑定的进行,有一个 .NET 发布者策略会在可能的情况下自动将针对 v2 构建的任何应用重定向到 v3
    • 这通常是您想要的 - 如果有新版本,请自动使用它
  • 结果是 v3 运行时/程序集被加载,尽管您最初打算(和 Powershell 的)运行 v2。
    • 如果没有 .NET 4 解决方法,这不会发生,因为默认情况下 v2 将在 .NET 2 下加载,因此发布者策略无法将其重定向到需要 .NET 4 的 v3。

很简单吧?!

因此,如果您想在 .NET 4 上保留 PSv2,您需要做的是手动禁用发布者策略。这可以在 app.config 文件中完成,请参阅此处的相关帖子。

于 2012-09-06T20:13:57.177 回答
0

如果您安装了 v3,我不明白为什么要将 v2 与 CLR 4 一起使用。如果您的模块需要 .NET 4,请使用 PowerShell v3:它已经使用 CLR 4。

于 2012-09-06T22:30:38.860 回答