【问题标题】:In PowerShell, How to implement event handler for COM objects?在 PowerShell 中,如何实现 COM 对象的事件处理程序?
【发布时间】:2011-08-13 01:04:22
【问题描述】:

我在 PowerShell 中创建了一个 COM 对象: $CivicFactory = new-object -comObject LocationDisp.CivicAddressReportFactory

我需要为“NewCivicAddressReport”实现事件处理程序。我试过这个:

Register-ObjectEvent $CivicFactory -EventName "NewCivicAddressReport" -Action ({ echo "haha" })

但它给了我"Register-ObjectEvent : Cannot register for event. An event with name 'NewCivicAddressReport' does not exist."

然后我尝试了$CivicFactory.add_NewCivicAddressRerport( {"haha"} )

它也不起作用:方法调用失败,因为[System.__ComObject#{bf773b93-c64f-4bee-beb2-67c0b8df66e0}] doesn't contain a method named 'add_NewCivicAddressRerport'

谁能告诉我如何在 PowerShell 中实现这个事件处理程序?提前致谢。 在 VBScript 中它就像

一样简单
Function CivicFactory_NewCivicAddressReport(report)
    Blablabla...
End Function

但在 PowerShell 中我无法正常工作。

【问题讨论】:

    标签: events object com powershell handler


    【解决方案1】:

    您可能对PSEventing 感兴趣,它处理 .NET、COM 和 WMI 对象事件处理。

    【讨论】:

    • 我会尝试$CivicFactory | Get-Member -Type Event 来获取您的对象可以订阅的所有事件。
    【解决方案2】:

    使用 Visual Studio 生成的 Interop 程序集。

    只要将 COM(库)引用添加到 C# 项目,IDE 就会构建一个包装器,使所有实体(包括事件和枚举)都可用于 .NET 世界。

    包装器通常打包在一个文件中,命名如下:

    Interop.<COM-library-name>.dll
    

    请注意,类名可能不同。使用 IL 反汇编程序 (ildasam.exe) 来识别您必须实例化的类。

    【讨论】:

      【解决方案3】:

      我试过 Get-Member:$CivicFactory | Get-Member -MemberType Event 但它什么也没返回。

      如果我在未指定成员类型的情况下运行 Get-Member,它会返回其方法和属性。并且方法和属性运行良好,所以我相信对象没问题。

      因此,PowerShell 系统似乎无法识别对象的事件。

      但是文档指出应该实现事件处理程序 NewCivicAddressReport,我已经在 VBScript 和 JScript 中成功地做到了。

      【讨论】:

        猜你喜欢
        • 2019-06-16
        • 2011-08-14
        • 2020-09-30
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2015-09-11
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多