调用COM属性和方法

时间:2010-11-22 04:12:15

标签: vb.net com invoke

我正在尝试动态创建COM对象,调用COM方法并设置COM属性。 COM类是VB6 ActiveX DLL。该实现完全等于此页面http://msdn.microsoft.com/en-us/library/ms973800.aspx中的VB6代码。

简而言之,项目为PhysServer,类名为Temperature,其中包含两个属性CelsiusFahrenheit以及两个方法GetCelsius()和{ {1}}。

我已经运行GetFahrenheit()将ActiveX DLL注册到计算机。 ProgID是regsvr32

我有三个代码块

代码块1(正常)

PhysServer.Temperature

代码块2(正常)

Option Explicit Off
Option Strict Off
...
Dim objType = Type.GetTypeFromProgID("PhysServer.Temperature")
Dim comObj = Activator.CreateInstance(objType)
comObj.Celsius = 100
Dim f As Double = comObj.GetFahrenheit()
Console.WriteLine(f) ' shows 212

代码块3(不起作用)

Option Explicit On
Option Strict On
...
Dim objType = Type.GetTypeFromProgID("PhysServer.Temperature")
Dim comObj = Activator.CreateInstance(objType)
Microsoft.VisualBasic.CallByName(comObj, "Celsius", CallType.Let, 100)
Dim f As Double = CDbl(Microsoft.VisualBasic.CallByName(comObj, "GetFahrenheit", CallType.Method, Nothing))
Console.WriteLine(f) ' shows 212

我理解代码块1和代码块2.但是,如何使用像代码块3这样的反射来设置COM对象?由于某些原因,我不能使用代码块1和代码块2.所以唯一的方法是代码块3 ...但它不起作用。

有谁知道Code Block 3的解决方案?谢谢!

1 个答案:

答案 0 :(得分:1)

试试这个:

objType.InvokeMember("Celsius", Reflection.BindingFlags.SetProperty Or ...

而不是SetField。

comObj是一个Runtime-Callable Wrapper,Celsius将是一个属性,而不是一个字段。

您也可能需要指定BindingFlags.Instance标志。

相关问题