【问题标题】:CLR detected an invalid program with powershellCLR 检测到带有 powershell 的无效程序
【发布时间】:2014-09-04 23:40:03
【问题描述】:

我正在尝试将 Powershell 脚本发送到服务器并执行它。服务器收到脚本,但是当我尝试创建 PS 实例时它崩溃了。我环顾四周寻找类似的案例,但大多数情况下似乎都是特定的。

public void processMsg(TcpClient client, NetworkStream stream, byte[] bytesReceived, int length)
        {    
            mstrMessage = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length);
            mscClient = client;
            mstrMessage = mstrMessage.Substring(0, length);
            Console.WriteLine(mstrMessage);

            if (mstrMessage.Length > 8)
            {
                if (mstrMessage.Substring(0, 8) == "%SCRIPT%")
                {
                    Console.WriteLine("Script recieved.");
                    try
                    {
  • 在下面的行中,我得到以下异常:Common Language 运行时检测到无效程序。

                        PowerShell powerShellInstance = PowerShell.Create();
                        using (powerShellInstance)
                        {
                            powerShellInstance.AddScript(mstrMessage);
                            powerShellInstance.Invoke();
                            Console.WriteLine("Script executed.");
                        }
    
                    }
                    catch (InvalidProgramException)
                    {
    
                        throw;
                    }
    
                }
            }
    

【问题讨论】:

  • 我对以这种方式调用 Powershell 一无所知,但是:这与需要不同的 .NET Framework 版本有关吗?例如,您是否以 2.0 运行,但 Powershell 正在尝试使用 4.0 中的某些内容?
  • @DarkFalcon 我正在使用带有 4.5.1 框架的 Powershell 3.0。检查此链接:technet.microsoft.com/en-us/library/hh847769.aspx 看起来我做得对。
  • @yavolo 您针对哪个版本的 System.Management.Automation.dll 编译您的主机应用程序(1.0 或 3.0)?该应用程序是针对哪个版本的 .NET 编译的 - 4.5.1?服务器上安装了哪些版本的 .NET?
  • @yavolo 在您引用的链接上,您是否看到此警告However, due to a change in the runtime activation policy in Microsoft .NET Framework 4.0, Windows PowerShell host programs that were written for Windows PowerShell 2.0 and compiled with Common Language Runtime (CLR) 2.0 cannot run without modification in Windows PowerShell 3.0, which is compiled with CLR 4.0.
  • @KeithHill 你是对的,问题是 Windows 管理框架已经过时了。当我安装 3.0 时,它运行良好。如果你想回答我会标记它。 :)

标签: c# powershell clr


【解决方案1】:

重要的一点是:A) 你编译的 System.Management.Automation.dll 版本是什么,B) 你完成的 .NET 版本是什么,C) PowerShell 和 .NET 安装在哪个版本上服务器。

很可能您的服务器运行的是过时的 PowerShell 版本,因此您编译的内容与服务器上可用的内容不同。

【讨论】:

  • 很抱歉提出一个问题的旧答案,但是如果您必须支持 PowerShell v2+,您如何使用 System.Management.Automation?我想针对 .NET 4.0(保证在服务器上)进行编译,并将 System.Management.Automation 包含在任何版本的 PowerShell 2 或更高版本中。我有什么选择?
  • @ferventcoder 如果您需要支持 v2,则必须针对 SMA.dll 的 1.0 版本进行编译。您应该能够在 4.0 中运行 PS 引擎。如果您已经到了支持 v3+ 的地步,请查看这篇博文 - blogs.msdn.com/b/powershell/archive/2015/12/12/…
  • 谢谢!寻找 1.0 SMA 可能很有趣。我认为如果人们可以将他们的计算机自动升级到豪华 v3,那将不是问题。不过,大多数人都不会接受。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多