PowerShell中的COM接口包装器?

4

我有以下的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" })

...it(预料中)告诉我:

方法调用失败,因为[System.__ComObject#{b1878bfe-53d3-402e-8c86-190b19af70d5}]不包含名为“add_CallStatus”的方法。

我尝试创建COM包装器,但仍然无法获取COM接口的类型...

有什么想法吗?非常感谢!

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5

PowerShell通过自己的后期绑定“COM适配器”特殊处理COM对象,以便向调用者(和Get-Member cmdlet)公开成员。不幸的是,如果它无法找到关联的type library,则有时会失败,这通常发生在通过透明代理类型暴露的远程COM对象实例。

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

这会导致在C#中显式实现接口时出现更多问题。PowerShell根本看不到它们!我曾经博客过一种使用v2.0模块代理显式接口成员的技术。你可以尝试对COM接口进行测试,但我不确定它是否有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,