gpt4 book ai didi

PowerShell中的COM接口(interface)包装器?

转载 作者:行者123 更新时间:2023-12-01 00:05:20 27 4
gpt4 key购买 nike

我在 C# 中有以下代码,我尝试将其移植到 PowerShell。
但我不知道如何移植这个 Actor :

((_ISkypeEvents_Event)skype).CallStatus += CallStatusHandler;

如果我只是在我的 PowerShell 控制台中键入 [Skype4COM.ISkypeEvents_Event],我会得到:

Unable to find type [Skype4COM.ISkypeEvents_Event]: make sure that the assembly containing this type is loaded.



但是,我可以获得 $skype 对象的所有成员:
$skype = New-Object -ComObject Skype4COM.Skype

以下行不起作用:
$skypeevent = [Skype4COM._ISkypeEvents_Event]$skype

如果我尝试直接在 $skype 对象上调用该方法,如下所示:
$skype.add_CallStatus({ write-host "yay" })

...它(如预期的那样)告诉我:

Method invocation failed because [System.__ComObject#{b1878bfe-53d3-402e-8c86-190b19af70d5}] doesn't contain a method named 'add_CallStatus'.



我试图创建一个 COM 包装器,但它仍然无法获取 COM 接口(interface)的类型......

有任何想法吗?非常感谢!

最佳答案

PowerShell 使用其自己的后期绑定(bind)“COM 适配器”对 COM 对象进行特殊处理,以便将成员公开给调用者(以及 Get-Member cmdlet)。不幸的是,如果找不到相关的 type library,有时会失败。 ,这通常发生在实例实际上是通过透明代理类型呈现的远程 COM 对象时。

这种 COM 改编的另一个副作用是间接阻止您使用这些类型的强制转换来访问成员。 PowerShell 通常公开互操作程序集的(动态创建或 PIA)CoClass 类,其中包括所有接口(interface)的成员。事实上,接口(interface)的这种限制不仅仅针对 COM 对象:PowerShell 中的“.NET 适配器”也不处理普通的旧 .NET 接口(interface)。老实说,这是 99% 案例的首选行为。 PowerShell 是一种动态语言,并且始终会在运行时公开引用的真实类型。任何转换为​​接口(interface)的尝试都将被忽略。

当您在 C# 中显式实现接口(interface)时,这会导致更多问题。 PowerShell 根本看不到它们! I did blog about a technique使用 v2.0 模块代理显式接口(interface)成员。您可以针对 COM 接口(interface)尝试它,但我不确定它是否会起作用。

关于PowerShell中的COM接口(interface)包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1637999/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com