【问题标题】:Calling COM methods from unreferenced assemblies从未引用的程序集中调用 COM 方法
【发布时间】:2014-12-17 14:31:56
【问题描述】:

我正在将安装脚本从 js 迁移到 vb.net,我遇到了以下问题。 我遇到了问题,因为 JS 是后期绑定的,所以我需要研究每种方法返回的数据类型,以便在 vb.net(或 C#)中生成强类型的对应对象

在原始的 js 安装脚本中,我已经到了不知道如何移植这 2 个调用的地步:

var objWMIService = GetObject("winmgmts:\\\\.\\root\\cimv2");
var objAccount = objWMIService.Get("Win32_SID.SID='S-1-1-0'");

如果我离开数据类型推断,我会得到 COMType,所以我不能从生成的对象调用 Get 方法。 我认为我可以通过使用 IDispatch 来解决这个问题,但是我使用 IDispatch 已经有 10 年了,我不记得确切的方法了。

另外,经过进一步研究,我发现内部 COM 实际上是一个 SWBemServicesEX 对象,我不知道要引用什么才能生成 COM 互操作系统。

如果有人能对此问题提供任何想法或解决方案,我将不胜感激。

当前的 vb.NET 代码只是:

Dim objWMIService = GetObject("winmgmts:\\.\root\cimv2")

不知道如何能够从 objWMIService 调用 Get 方法,以及如何确定该方法实际返回的内容!

【问题讨论】:

  • 从另一个答案,我读到Type.InvokeMember() 使用IDispatch 方法,所以你可以尝试动态调用Get()
  • 尝试改用Dim objWMIService as Object = GetObject("winmgmts:\\.\root\cimv2")。然后你可以使用Dim objAccount as Object = objWMIService.Get("Win32_SID.SID='S-1-1-0'")。在进行后期绑定时,将所有内容声明为对象。然后,您可以在调试中单步执行代码,有时可以查看返回值。然后搜索该类型的方法/属性/等并写下你的下一行。需要做一些工作,但您不需要引用任何 dll。只是假设 dll 已注册 (COM) 或在 .Net 遵循的路径 (CLR) 中。

标签: javascript .net vb.net com wmi


【解决方案1】:

我结束了史蒂夫在回答中所说的事情,它为我解决了这个问题。我对运行时后期绑定不太满意,但它完成了工作!

供参考:

尝试使用 Dim objWMIService as Object = GetObject("winmgmts:\.\root\cimv2") 代替。然后您可以使用 Dim objAccount 作为 Object = objWMIService.Get("Win32_SID.SID='S-1-1-0'")。在进行后期绑定时,将所有内容声明为对象。然后,您可以在调试中单步执行代码,有时可以查看返回值。然后搜索该类型的方法/属性/等并写下你的下一行。需要做一些工作,但您不需要引用任何 dll。只是假设 dll 已注册 (COM) 或在 .Net 遵循的路径中 (CLR)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2010-10-17
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2013-12-22
    相关资源
    最近更新 更多