在PowerShell中COM接口的包装?(COM interface wrappers in Po

2019-09-01 23:30发布

我在C#下面的代码,我尝试移植到PowerShell的。 但我不知道如何端口这个转换:

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

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

找不到类型[Skype4COM.ISkypeEvents_Event]:请确保包含此类型的程序集被加载。

不过,我可以得到$ Skype的对象的所有成员:

$skype = New-Object -ComObject Skype4COM.Skype

下面的行不工作:

$skypeevent = [Skype4COM._ISkypeEvents_Event]$skype

如果我尝试直接调用$ Skype的对象的方法,如下所示:

$skype.add_CallStatus({ write-host "yay" })

......它(如预期)告诉我说:

方法调用失败,因为[系统.__ ComObject#{b1878bfe-53d3-402e-8c86-190b19af70d5}]不包含名为 'add_CallStatus' 的方法。

我试图创建一个COM包装,但它仍然无法顺利地向COM接口类型...

有任何想法吗? 十分感谢!

Answer 1:

PowerShell的特殊情况下,COM对象有它自己的后期绑定,以揭露成员呼叫者(和“COM适配器” 获取会员 cmdlet的)。 不幸的是这个,如果它不能找到相关有时会失败的类型库 ,当实例实际上是一个远程COM对象通过transparentproxy型浮出水面这通常发生。

这个COM适应的另一个副作用是,你是间接地使用这些类型的类型转换来访问成员阻止。 PowerShell的通常暴露互操作组件的(动态创建或PIA)的CoClass类,其中包括所有接口的成员。 事实上,在接口这一限制不仅与COM对象:“.NET适配器”在PowerShell不会与普通的旧.NET接口处理无论是。 说实话,这是案件99%的首选行为。 PowerShell是一个动态的语言,总是会暴露真实类型在运行时参考。 投到一个接口的任何企图都将被忽略。

当你在C#中明确实现的接口这将导致更多的问题。 PowerShell中无法看到它们了! 我没有在博客的技术来使用V2.0模块代理显式接口成员。 你可以尝试对一个COM接口,但我不能肯定它会工作。



文章来源: COM interface wrappers in PowerShell?