8bi*_*dge 5 c# powershell system.management
我有一个使用 PowerShell 查询系统信息的 C# 测试应用程序的代码,其中有一些简单的函数,如下所示:
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 替换所有内容可以消除该问题。