在阅读了其他几篇博客文章和文章(下面的参考资料)之后,似乎有几种方法可以在PowerShell 4.0上运行.NET,但是很少有方法可以满足我们的需要。由于我们如何部署软件,我们无法更新注册表或更改添加应用程序。这给我们留下了两个选项:使用ConsoleShell创建自己的shell或重写PSHost。我们希望能够使用第一个选项,ConsoleShell,由于它的简单性,但我们想知道我们可能遇到哪些问题,以及是否建议这样做。
参考文献
基于其他问题,我看到您可以使用以下方法将PowerShell作为.NET 4.0运行。这些方法似乎都没有得到微软的正式认可,但下面的第一个方法是这微软连接问题中的一个工作。
在PowerShell 4.0中运行.NET的选项似乎包括:
ConsoleShell托管您自己的PowerShell控制台PSHost,如PoshConsole或努基特所做的那样发布于 2011-11-16 16:44:47
(据我所知)据我所知,除了你以外,没有人能批准它。如果您的方案有效并通过了合理的测试,请批准并使用它。
我在PowerShell 4.0上使用.NET,但与选项4一起使用,也使用了选项1 (我个人不喜欢选项2 )。因此,我批准了它,生产与否,我经常使用它,它工作。我仍然在.NET 2.0上使用.NET,原因有两个: 1) PowerShell.exe启动速度更快(特别是x64);2)确保.NET的部分开发与.NET 2兼容。
另一个想法。如果在PowerShell上的.NET 2.0中某些东西不能正常工作(确实存在一些问题,请参阅.NET),那么“它被批准用于生产”这一事实本身并没有多大帮助。一个人必须克服现有的问题,.NET 2或.NET 4并不重要。
我应该说我也试过第三种选择。我没有找到适合在我的场景中使用它的用例。但我在使用ConsoleShell时也没有发现任何问题。
P.P.S还有另一个选择。制作PowerShell.exe的副本,将其重命名为MyConsoleShell.exe,将其与为.NET 4配置的MyConsoleShell.exe.config一起使用。如果您要使用单独的应用程序,为什么不考虑这一点?
发布于 2012-02-22 06:22:02
我有点像一个powershell N00b,但是我把它放在一起作为一种强制任意脚本在我的脚本中使用.NET 4.0的方式:
# Place this at the top of your script, and it will run as a .NET 4 ps script.
# #############################################################################
if ($PSVersionTable.CLRVersion.Major -lt 4) { try {
$cfgPath = $Env:TEMP | Join-Path -ChildPath ([Guid]::NewGuid())
mkdir $cfgPath | Out-Null
"<configuration><startup useLegacyV2RuntimeActivationPolicy='true'><supportedRuntime version='v4.0'/></startup></configuration>" | Set-Content -Path $cfgPath\powershell.exe.activation_config -Encoding UTF8
$darkMagic = 'COMPLUS_ApplicationMigrationRuntimeActivationConfigPath'
$old = [Environment]::GetEnvironmentVariable($darkMagic)
[Environment]::SetEnvironmentVariable($darkMagic, $cfgPath)
& powershell.exe $MyInvocation.MyCommand.Definition $args
} finally {
[Environment]::SetEnvironmentVariable($darkMagic, $old)
$cfgPath | Remove-Item -Recurse
return
}}
# ##############################################################################
# My script starts here:
echo "Your arguments are: $args "
echo "The CLR Major Version is : $($PSVersionTable.CLRVersion.Major)"它在脚本的开头放置一个检查,如果不是.NET 4.0,它会创建一个配置文件,设置一个环境变量并重新运行powershell脚本,以便它在.NET 4.0下运行。
在我的pc上,它确实会导致启动时间的损失大约1秒钟左右,但至少它能工作:)
https://stackoverflow.com/questions/8152988
复制相似问题