在 C# 中访问 Powershell COM 对象

本文关键字:COM 对象 Powershell 访问 | 更新日期: 2023-09-27 17:56:33

我需要将Powershell脚本转换为C#。

Powershell 脚本访问 Windows 部署服务 COM 对象:

$wdsObject = New-Object -ComObject WdsMgmt.WdsManager
$wdsServer = $wdsObject.getWdsServer("Localhost")
[...]

是否可以在 C# 中访问这些 COM 对象?

我在 Visual C# 中找不到相应的 COM 对象引用。我尝试将 System32 中的wdsmgmt.dll添加为 C# 项目中的引用,但这不起作用。否则我很困惑。

编辑:

对评论1的回答:从 C# 访问 COM 对象的最佳方式

有问题的 COM 对象未在引用中列出。我已经浏览了大约 5 次列表,以确保我不会错过它。有没有办法使该 COM 对象显示在 C# 的 COM 引用列表中?

对评论 2 的回答(什么不起作用):尝试添加 wdsmgmt.dll 显示以下错误:

Please make sure the file is accessible, and that it is a valid assembly or COM component.

该文件是可访问的,但在 C# 眼中它似乎不是一个有效的 COM 组件。

在注册表中搜索 WdsMgmt 显示 COM 对象至少以某种方式存在:

HKEY_LOCAL_MACHINE'SOFTWARE'Classes'CLSID'{CD583E47-B079-4025-A799-5F951D016D3E}

也许改写的问题是:

当我知道 COM 对象引用在 Powershell 中的名称时,如何添加对 C#

在 C# 中访问 Powershell COM 对象

的引用?

你可以通过使用 dynamic 和 ProgID 创建实例来直接镜像 PowerShell 所执行的操作。例如,请参阅 https://stackoverflow.com/a/3251325/8446。

你试过使用TlbImp吗?

创建 COM 类包装器

若要使 C# 代码引用 COM 对象和接口,需要 在 C# 中包含 COM 接口的 .NET Framework 定义 建。最简单的方法是使用 TlbImp.exe(类型库) Importer),一个包含在 .NET Framework SDK 中的命令行工具。 TlbImp将COM类型库转换为.NET Framework元数据 — 有效地创建可从任何 托管语言。使用 TlbImp 创建的 .NET Framework 元数据可以是 包含在通过/R 编译器选项的 C# 版本中。如果您正在使用 在Visual Studio开发环境中,你只需要添加一个 引用 COM 类型库并为您完成转换 自然而然。

下面是有关此互操作工具的详细信息:

Tlbimp.exe(类型库导入器)