如何从COM对象调用方法(无法将System.__ComObject强制转换为我的COM类)

本文关键字:COM ComObject 转换 我的 System 对象 调用 方法 | 更新日期: 2023-09-27 18:26:49

我可以在本地创建COM对象

var infsrv = new InfoServ.TInfoServerClass(); //COM object
infsrv.RunBsScript(bssScriptName, strOfParam); //calling method

但我需要在服务器上创建COM对象,所以代码是:

var myGuid = new Guid("00C4261D-0B2B-4230-A2CA-A9F4F2A46452");
var myType = Type.GetTypeFromCLSID(myGuid, servername);
InfoServ.TInfoServerClass infsrv = (InfoServ.TInfoServerClass)Activator.CreateInstance(myType);
infsrv.RunBsScript(bssScriptName, strOfParam);

但现在它说:

无法强制转换类型为"System"的COM对象__ComObject"到类类型"InfoServ.TInfoServerClass".COM组件,这些组件进入CLR并执行不支持IProvideClassInfo或不具有任何互操作程序集已注册的将封装在__ComObject类型中。此的实例类型不能强制转换为任何其他类;但是它们可以被铸造只要底层COM组件支持QueryInterface调用接口的IID。

我该怎么办?

如何从COM对象调用方法(无法将System.__ComObject强制转换为我的COM类)

您应该能够将通过调用Activator.CreateInstance创建的实例强制转换为接口。

您应该在Interop程序集中定义一个名为InfoServ.TInfoServer的接口(如果类型库明确为其定义了接口,则为ITInfoServer),如果您将Activator.CreateInstance返回的对象强制转换为该接口,您应该看到CoClass(TInfoServerClass)公开的所有方法/属性。

通常使用"添加引用"对话框添加对COM库的引用。然后,您可以像使用任何其他类一样使用导入的类型。