Interoping With PowerShell CmdLets
本文关键字:CmdLets PowerShell With Interoping | 更新日期: 2023-09-27 18:31:45
我一直在编写一些实用程序,这些实用程序使用PowerShell Cmdlets用于App-V。 有趣的部分是Microsoft似乎只记录 cmdlet,而不是 Powershell 模块后面使用的 .net 程序集。
现在,我熟悉了 P/Invoke 和 COM Interop,并且已经学会了如何使用 System.Management.Automation 来创建 powershell 会话并调用 cmdlet。
但是有些东西对我来说闻起来不对劲。 我基本上是在编写自己的包装类,以对其余代码隐藏 powershell 调用。 似乎我应该 a) 绕过 powershell 并直接转到它后面的托管库,或者 b) 应该有更好的机制来为 powershell cmdlet 生成互操作库。
这些天,Microsoft似乎大量使用PS CmdLets,它本质上正在成为一种新的互操作API。
我错过了什么吗? 在这种情况下使用什么好的策略?
你对"气味"的看法是对的。绕过 powershell 不是编写实用工具的最佳方式,因为它后面的未记录托管库比 cmdlet 更有可能以无提示方式更改。使用这种方法可能会给您带来麻烦。
你试图组合几乎不可组合的东西。解决方案是引入一个代理,该代理允许以更自然的方式将代码与 ps cmdlet 组合在一起。
在您的情况下,可以创建以自然方式与 cmdlet 通信并提供必要的功能的 ps 脚本。在 c# 代码中,只需调用 powershell.exe。如果这听起来也不适合您,那么只需使用 System.Management.Automation 来创建 powershell 会话并调用您的脚本。此方法更安全,因为现在你在 Powershell 代理中与记录的 ps cmdlet 通信(自然 powershell 方式),并从 c# 代码与 ps 脚本通信(这使您可以更好地控制代码)
尽管很痛苦,但通过 System.Managment.Automation 与 cmdlet 交互并将结果转换为管道另一端的强类型对象将是解决问题的最稳定方法。
查看Microsoft自己的 AppV 客户端托盘应用程序。它提供了它运行的 powershell 命令来完成它所做的一切。
你可能会成功访问提供 cmdlet 的托管库,但正如你所指出的,它们没有文档,并且可能会从你下面更改。 即便如此,你也可能缺少一些东西,比如你从Get-AppVirtualProcess获得的AppVPackageData NoteProperty。