You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调试时PowerShell.Create返回空值,运行代码出现空引用异常且无InvokeAsync方法的问题排查

关于PowerShell.Create()空引用异常与InvokeAsync方法缺失的问题解答

先来说说你遇到的两个问题,逐个分析:

一、PowerShell.Create()抛出NullReferenceException的可能原因

你提到在PowerShell.Create()处出现Object reference not set to an instance of an object的异常,结合你的场景和代码,常见原因有这几个:

  • 依赖包版本或框架不兼容:
    虽然你安装了Microsoft.PowerShell.Sdk,但这个包主要针对.NET Core/.NET 5+框架。如果你的项目还是基于.NET Framework,可能存在兼容性问题——Windows PowerShell(对应.NET Framework)的API和PowerShell 7+的SDK不是完全对齐的,静态初始化时内部对象可能无法正确实例化,导致空引用。

  • NuGet包加载异常:
    有时候NuGet缓存损坏或者依赖包没有完整安装,会导致System.Management.Automation(PowerShell SDK的核心依赖)的程序集没有正确加载,进而让Create()方法无法初始化内部的PowerShell运行时环境,抛出空引用异常。

  • 运行环境限制:
    从你的作者信息来看,可能是在SharePoint环境中运行?这类受限环境可能会限制PowerShell运行时的初始化(比如缺少必要的环境变量、权限不足,或者沙箱机制阻止了PowerShell组件的加载),导致Create()方法返回null或者内部对象未初始化。

针对这个问题的解决建议:

  1. 先检查项目的目标框架:如果是.NET Framework,建议卸载Microsoft.PowerShell.Sdk,转而安装System.Management.Automation包(对应Windows PowerShell 5.1的API);如果是.NET Core/.NET 5+,确保Microsoft.PowerShell.Sdk和System.Management.Automation都是最新稳定版本。
  2. 清理NuGet缓存后重新安装所有依赖:执行dotnet nuget locals all --clear(如果是.NET Core项目),然后重新还原包。
  3. 在一个干净的控制台项目中测试你的代码,排除SharePoint环境的影响——如果控制台项目能正常运行,那问题大概率出在SharePoint的运行环境限制上,需要调整权限或环境配置。

二、为什么你的PowerShell方法中没有InvokeAsync方法

InvokeAsync是PowerShell 7+版本引入的异步API,属于System.Management.Automation的新增方法,而旧版的Windows PowerShell(5.1及以下)的API中只有BeginInvoke/EndInvoke的异步模式,没有InvokeAsync。

导致你看不到这个方法的原因:

  • 你安装的Microsoft.PowerShell.Sdk版本过低,对应的System.Management.Automation版本不支持InvokeAsync。
  • 你的项目基于.NET Framework,引用的是Windows PowerShell的System.Management.Automation程序集,而非PowerShell 7+的SDK包。

解决建议:

  1. 升级Microsoft.PowerShell.Sdk到最新稳定版本(目前是7.x系列),确保依赖的System.Management.Automation版本足够新。
  2. 如果必须使用.NET Framework,那只能继续用BeginInvoke/EndInvoke的异步模式,或者考虑将项目迁移到.NET Core/.NET 5+来使用InvokeAsync。

另外,顺便提一下你代码里的一个小冗余:你把parameters转成了parameterList但没用到,反而直接传了parameters给AddParameters——不过这和当前的异常无关。

你的代码示例:

public async Task<string> RunScript( string contentScript, Dictionary<string, EntityProperty> parameters) {
    List<string> parameterList = new List<string>();
    foreach( var item in parameters ) {
        parameterList.Add( item.Value.ToString() );
    }
    using( PowerShell ps = PowerShell.Create() ) {
        ps.AddScript( contentScript );
        ps.AddParameters( parameters );
        IAsyncResult async = ps.BeginInvoke();
        StringBuilder stringBuilder = new StringBuilder();
        foreach( PSObject result in ps.EndInvoke( async ) ) {
            stringBuilder.AppendLine( result.ToString() );
        }
        return stringBuilder.ToString();
    }
}

内容的提问来源于stack exchange,提问作者ZZZSharePoint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:32:33