Vb.net 调用COM属性和方法

Vb.net 调用COM属性和方法,vb.net,com,invoke,Vb.net,Com,Invoke,我正在尝试动态创建COM对象,调用COM方法并设置COM属性。COM类是一个VB6 ActiveX DLL。该实现与本页中的VB6代码完全相同 简言之,该项目是PhysServer,类名是Temperature,它有两个属性centrics和Fahrenheit以及两个方法getcentrics()和GetFahrenheit() 我已经运行了regsvr32将ActiveX DLL注册到计算机。程序ID为physerver.Temperature 我有三段代码 代码块1(有效) 代码块2(有效

我正在尝试动态创建COM对象,调用COM方法并设置COM属性。COM类是一个VB6 ActiveX DLL。该实现与本页中的VB6代码完全相同

简言之,该项目是
PhysServer
,类名是
Temperature
,它有两个属性
centrics
Fahrenheit
以及两个方法
getcentrics()
GetFahrenheit()

我已经运行了
regsvr32
将ActiveX DLL注册到计算机。程序ID为
physerver.Temperature

我有三段代码

代码块1(有效)

代码块2(有效)

代码块3(不工作)

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

有人知道代码块3的解决方案吗?谢谢

试试这个:

objType.InvokeMember("Celsius", Reflection.BindingFlags.SetProperty Or ...
而不是设置字段

comObj是一个运行时可调用的包装器,它的属性是摄氏度,而不是字段

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

尝试以下操作:

objType.InvokeMember("Celsius", Reflection.BindingFlags.SetProperty Or ...
而不是设置字段

comObj是一个运行时可调用的包装器,它的属性是摄氏度,而不是字段


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

这不是RCW,他使用的是后期绑定。天知道为什么。谢谢男人们。。。我在网上找到了解决办法。请阅读我的答案。@Hans Passant:当然,即使使用IDispatch,它仍然是RCW?它不是。不需要互操作库,因此无法生成RCW。IDispatch足够了。谢谢Chris。很抱歉上次的帖子。我认为你的回答是解决问题的办法。应该删除
InvokeMethod
。它不是RCW,他使用的是后期绑定。天知道为什么。谢谢男人们。。。我在网上找到了解决办法。请阅读我的答案。@Hans Passant:当然,即使使用IDispatch,它仍然是RCW?它不是。不需要互操作库,因此无法生成RCW。IDispatch足够了。谢谢Chris。很抱歉上次的帖子。我认为你的回答是解决问题的办法。并且应该删除
InvokeMethod
Option Explicit On
Option Strict On
...
Dim objType = Type.GetTypeFromProgID("PhysServer.Temperature")
Dim comObj = Activator.CreateInstance(objType)
Dim f As Double = CDbl(objType.InvokeMember("GetFahrenheit", Reflection.BindingFlags.InvokeMethod, Nothing, comObj, Nothing))
Console.WriteLine(f) ' shows the default value of GetFahrenheit '
objType.InvokeMember("Celsius", Reflection.BindingFlags.SetField Or Reflection.BindingFlags.InvokeMethod, Nothing, comObj, New Object() {100}) ' throws exception: Number of parameters specified does not match the expected number '
f = CDbl(objType.InvokeMember("GetFahrenheit", Reflection.BindingFlags.InvokeMethod, Nothing, comObj, Nothing))
Console.WriteLine(f)
objType.InvokeMember("Celsius", Reflection.BindingFlags.SetProperty Or ...