首页 > 解决方案 > 对在 PowerShell 中添加程序集以使用 .NET 类感到困惑

问题描述

我将不胜感激。在 PowerShell 中使用 .NET Framework 类时,有时我们必须将程序集加载到内存中,我们必须在 PowerShell 中使用 Add-Type Cmdlet。因此,例如,如果我想使用 System.ServiceProccess.ServiceController 类,我会做这样的事情

Add-Type -AssemblyName System.ServiceProcess

但这是我感到困惑的地方。文档说 System.ServiceProcess.ServiceController 类有 2 个程序集

https://docs.microsoft.com/en-us/dotnet/api/system.serviceprocess.servicecontroller?view=netframework-4.8即:System.ServiceProcess.ServiceController.dllSystem.ServiceProcess.dll

无论我添加哪一个,它似乎都有效,但我想知道引擎盖下发生了什么。

更令人困惑的是 Process 类: https ://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process?view=netframework-4.8

这里我们有 3 个程序集:System.Diagnostics.Process.dll、System.dllnetstandard.dll

我只能加载 System.Dll。另一个 2 它只是说找不到程序集。

所以问题是,如果我想使用 .NET Framework 类,我假设我应该拥有所有的 aasemblies,那么如何将它们全部加载到 PowerShell 中?

希望这很清楚,并感谢您的回答。

亲切的问候,

约翰

标签: c#.netpowershell

解决方案


System.ServiceProcess.dll位于 GAC 中,并且是 .NET Framework 的一部分。 System.ServiceProcess.ServiceController.dll是核心 CLR 的一部分。

但请稍等 - PowerShell 基于 .NET Framework CLR。

如果您根据正确的netstandard profile构建程序集,并且它的依赖项是可解析的,那么它应该能够在 .NET Framework 上运行。

可以看到System.ServiceProcess.dll引用kernel32,while System.ServiceProcess.ServiceController.dll引用api-ms-win-service-core

有点类似,但 Core CLR 版本的功能可能会更少

至于其他的,大部分System命名空间位于mscorliband中System.dll。近年来,人们一直在努力通过将部分核心库移出以进行带外交付来使核心库更精简。

例如,System.Diagnostics.Process.dll现在作为nuget 包发布,它可以更快地向用户推出,而不是发布需要安装目标的主要 .NET Framework 更新。

如果您使用的是常规 Powershell 而不是Powershell Core,则可以仅引用 .NET Framework 程序集而不会感到困惑


推荐阅读