C#System.Management.Automation.Powershell类在Invoke()调用时泄漏内存

我有一个C#测试应用程序的代码,它使用PowerShell查询系统信息,在其中我有一些简单的函数,如下所示:

public void GetSystemInfo() { using (PowerShell ps = PowerShell.Create()) { ps.AddCommand("Get-Disk"); // Get-Disk is an example; this varies foreach (PSObject result in ps.Invoke()) { // ... // Do work here. Process results, etc... // ... } } } 

这很简单,主要来自MSDN示例,例如: https : //msdn.microsoft.com/en-us/library/dd182449(v = vs。85).aspx

问题是,每次调用此函数时,我都可以看到应用程序的内存占用增长。 足迹在调用ps.Invoke()时正在增长,并且永远不会收缩。 我如何处理数据并不重要; 我甚至可以完全评论foreach循环的主体,并且内存永远不会被垃圾收集。

从我看到PowerShell类接口可以看出,似乎没有办法强制它自我清理,并且Dispose()显然不起作用,因为资源在使用后仍然在内存中泄漏阻止退出。

这是C#PowerShell类实现中的已知错误还是PowerShell本身? 是否有人知道解决方案,或者可能的替代方案?


编辑

我现在也试过了,结果相同:

 public void GetSystemInfo() { Runspace rs = RunspaceFactory.CreateRunspace(); rs.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = rs; ps.AddCommand("Get-Disk"); // Get-Disk is an example; this varies foreach (PSObject result in ps.Invoke()) { // ... // Do work here. Process results, etc... // ... } rs.Close(); } 

再次,超级直截了当。 取自这里的样本。

我想知道这是否是Powershell模块中的一个已知错误。 也许我会开始研究Powershell接口(WMI等)的替代品,因为我需要在不确定的长持续时间内定期调用这些PS查询。

在C#库中确实存在Powershell API的问题。 即使强制垃圾收集似乎也没有释放内存。

用WMI调用而不是Powershell替换所有内容消除了这个问题。