使用PowerShell与.NET 3.5运行时/库

7

是否可以使用3.5运行时来支持PowerShell 1.0(或2.0 CTP),而不是2.0?

我们正在构建一个.NET 3.5解决方案,我仍然想将PowerShell作为我们的定期任务等脚本引擎。

我不需要LINQ语法或其他任何东西,只需要3.5库和运行时。

跟进问题:感谢您关于动态加载程序集的回复。但是让我澄清我的问题:是否有任何方法可以运行PowerShell以便默认运行3.5库?例如,如果我输入New-Object System.Xml.XmlDocument,我是否默认获取3.5版本?

半相关问题:如果我确实需要动态加载3.5中的System.Xml库,它会覆盖现有的符号定义,以便下一次我键入New-Object System.Xml.XmlDocument时,它将加载3.5版本吗?

4个回答

8
如果您的系统上安装了3.5版本,那么运行PowerShell时就会得到这个版本。PowerShell只需要2.0版本,但3.0和3.5版本兼容,并且在安装后自动转发。在PowerShell V2中,我们实际上会查看您安装的版本,并“启用”某些功能(例如,当您安装了3.51时,PowerShell_ISE和Out-GridView可用)。尝试一下!享受它!参与其中! Jeffrey Snover [MSFT] Windows管理合作伙伴架构师

4
只要您正确地输入了完全限定名称,我不认为这会有任何问题:
[System.Reflection.Assembly]::Load("System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")

我只使用Linq,因为它是我首先想到的。此时,下拉列表已经加载完成,您可以创建/使用其中的对象。


我假设,如果我动态加载一个.NET 3.5程序集(包括我可能编写的任何程序集),然后创建一个.NET对象(比如System.Xml.XmlDocument),并将其传递给我的程序集中的方法,那么我将会把一个2.0对象传递给一个3.5对象。我的理解正确吗? - Zach Blocker
因此,要传递一个3.5 XmlDocument,我实际上需要导入.NET 3.5 System.Xml库,就像您演示System.Xml.Linq库一样。 - Zach Blocker
我不是专业的开发人员,但我倾向于同意您上面的假设是正确的。 - Marco Shaw

3

3.5 实际上是 2.0 的一个 ADD-ON。也就是说,3.5 中没有被取代的类;它不是一个替换品。CLR(公共语言运行时)仍然是 v2.0。


3

PowerShell是针对2.0构建的,因此您必须至少具有2.0版本。但正如James所说,您可以通过加载适当的程序集来加载3.0和3.5功能。LINQ是3.5的一个很好的例子,但您也可以从PowerShell中使用WPF(3.0)。但要注意WPF的STA和MTA,因为只有PowerShell v2完全支持WPF(线程亲和力的完全支持)。


我的关于叠加的问题怎么样了?我能否通过加载等效的3.5程序集来替换(或至少隐藏)2.0程序集,以便System.Xml.XmlDocument的默认实现(例如)发生变化? - Zach Blocker
我会尽力找到确定的方法。抱歉,我错过了那部分内容。随意取消标记为答案。 - Marco Shaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接