我正在尝试动态创建COM对象,调用COM方法并设置COM属性。 COM类是VB6 ActiveX DLL。该实现完全等于此页面http://msdn.microsoft.com/en-us/library/ms973800.aspx中的VB6代码。
简而言之,项目为PhysServer
,类名为Temperature
,其中包含两个属性Celsius
和Fahrenheit
以及两个方法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的解决方案?谢谢!
答案 0 :(得分:1)
试试这个:
objType.InvokeMember("Celsius", Reflection.BindingFlags.SetProperty Or ...
而不是SetField。
comObj是一个Runtime-Callable Wrapper,Celsius将是一个属性,而不是一个字段。
您也可能需要指定BindingFlags.Instance
标志。