命名空间'System.Management'缺少自动化。 缺少程序集引用。

5

操作系统: Windows 7 Professional 64位, PowerShell版本为2.0,没有安装Visual Studio (无法安装以及其他原因)

尝试从C#中运行PowerShell。以下是代码片段:

using System;
using System.Management.Automation;  

class Hello {
    static void Main(string[] args) {           
        PowerShell ps = PowerShell.Create();
        ps.AddCommand("Get-Process");
        Console.WriteLine("Process                 Id");
        Console.WriteLine("----------------------------");
        foreach (PSObject result in ps.Invoke()) {
            Console.WriteLine(
            "{0,-24}{1}",
            result.Members["ProcessName"].Value,
            result.Members["Id"].Value);
            } 
        }       
    }

错误:

e:\foo.cs(2,25):error CS0234:名称空间'System.Management'中不存在类型或命名空间名称'Automation'(是否缺少程序集引用?)

由于没有Visual Studio,我以裸代码方式运行代码。由于出现错误,我从 http://www.dll-found.com/system.management.automation.dll_download.html 下载了dll文件,并按照说明放置在目录中。重启计算机后,仍然没有成功。

首先,我想问一个通用问题。如何安装缺失的程序集或dll文件(仅限文件),因为对于某些文件,您可能需要安装整个Windows或PowerShell SDK或.NET Framework。

编辑
我已经将下载的dll文件放置在C:\Windows\SysWOW64、C:\Windows\system32、C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5和C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0中。

我使用以下编译器进行编译: C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /target:exe /out:E:\foo.exe E:\foo.cs


你是否添加了 System.Management.Automation.dll 的引用? - Nasir Mahmood
你如何编译你的文件?如果你直接运行 csc.exe,你必须在它的命令行中指定所有引用,而不仅仅是将 "copy" 的 dll 文件复制到同一个目录。 - v.karbovnichy
3个回答

11

警告: 在任何理智的情况下都不要从随意的网站下载DLL。尽可能使用NuGet包(或者您项目使用的首选软件包管理器)。如果找不到DLL,几乎总会有一个很好的理由,您需要找出它并修复它,而不仅仅从互联网上获取DLL。

如果你在重新定向旧项目到.NET 4.8等版本后出现这个问题,那么原因是NuGet软件包名称已更改。

  • 卸载 System.Management.Automation 软件包
  • 安装 Microsoft.PowerShell.5.1.ReferenceAssemblies 软件包 (NuGet)

这个软件包名称出现在命名空间 System.Management.Automation 的类的文档中。


9
NuGet 对我有用。
PM> Install-Package System.Management.Automation.dll -Version 10.0.10586

3

您需要使用在MSDN中描述的/reference命令行参数来运行csc.exe

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /reference:system.management.automation.dll /target:exe /out:E:\foo.exe /E:\foo.cs

在我接受你的答案之前(它有效),你能否评论两件事。从http://www.dll-found.com下载dll /文件好吗?哪些路径通常用于搜索参考dll文件,以便我只能将dll文件放入该文件夹中。或者我可以将其放在任何驱动器或文件夹中吗? - msinfo
1
从那里下载文件可能不是很好,因为你可能需要一组文件的不同版本、处理器架构等,而不仅仅是一个文件。你需要一致的文件版本。只有当你不知道这些dll来自哪里时,才可以从dll-found.com下载它们,但你必须知道它们的公共接口可能不匹配,会出现问题。 - v.karbovnichy
感谢kpa6uk提供的信息。通过一番谷歌搜索,我找到了第二个问题的答案。 - msinfo
哦,我忘记了第二个问题,抱歉) - v.karbovnichy
3
从随机网站下载DLL文件并链接它们是一个可怕的想法,可能会导致感染病毒。请使用官方文档确定你需要哪个DLL文件,并从可信赖的来源获取它。在任何合理的情况下,都不应该使用分发随机DLL文件的网站。 - Sqeaky

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