无法将类型为“System .__ ComObject”的COM对象强制转换为类类型AgentInfo
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将类型为“System .__ ComObject”的COM对象强制转换为类类型AgentInfo相关的知识,希望对你有一定的参考价值。
我有两个C#项目,一个是dll,另一个是Windows窗体应用程序。
我在dll中定义了一个CoClass,如下所示''
[ComVisible(true),
Guid("1620BE13-A68F-4FA3-B5C8-31092D626CDA"),
ProgId("AgentDLLServer.AgentInfo"),
ClassInterface(ClassInterfaceType.AutoDispatch),
ComSourceInterfaces(typeof(IAgentInfoEvents))
]
public class AgentInfo : _IAgentInfo {}
它实现了接口_IAgentInfo,其定义如下
[
ComVisible(true),
Guid("CF803265-AE9D-4308-B790-560FCF63DD4C"),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface _IAgentInfo{}
两者都在dll中定义,使用后成功注册
regasm /tlb
在另一个C#windows客户端应用程序中,我尝试通过转换从运行对象表或从另一个接口获取的对象来访问AgentInfo,如下所示:
_IAgentInfo info =(_IAgentInfo) RotNativeMethods.GetObject("BizBrainAgentService.AgentInfo");`.
上面的代码从ROT中检索对象,或者我从ROT获得另一个接口,如下定义
[
ComVisible(true),
Guid("9B539A5F-5671-48AD-BF9B-7A9AF150CE39"),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface _IAgentDLLServer
{ AgentInfo GetAgentInfo();}
我从ROT获得对接口_IAgentDLLServer的引用,然后在其上调用方法GetAgentInfo()
`_IAgentDLLServer server= (_IAgentDLLServer)RotNativeMethods.GetObject("BizBrainAgentService.AgentServer") `AgentInfo info=server.GetAgentInfo();
我可以将它强制转换为_IAgentInfo,但是当我尝试将返回的对象强制转换为AgentInfo时,如下所示
AgentInfo info =(_IAgentInfo) rotNativeMethods.GetObject("BizBrainAgentService.AgentInfo");
我收到以下错误
Unable to cast COM object of type 'System.__ComObject' to class type 'AgentDLLService.AgentInfo'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.
我尝试了以下解决方案
一个。关于main方法的STAThread,因为帖子提示运行此对象的线程无法访问类型信息,如Why cannot I cast my COM object to the interface it implements in C#? 所示
湾更改了应用配置文件,如下所示
<configuration>
<startup>
<supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
并且版本与注册表的InProcServer32中的版本匹配
HKEY_CLASSES_ROOTWow6432NodeCLSID{1620BE13-A68F-4FA3-B5C8-31092D626CDA}InprocServer321.0.0.0RuntimeVersion,
按照
.NET Framework 4.5 is default and .NET Framework 3.5 is optional andThe strange case of System.InvalidCastException (“Unable to cast COM object of type ‘System.__ComObject’ to class type System.Windows.Forms.UserControl”) showing toolwindow
C。我尝试了ComImport方法
[ComImport,
Guid("1620BE13-A68F-4FA3-B5C8-31092D626CDA")]
public class AgentInfo { }
在我想要使用此对象的类中,根据A lean method for invoking COM in C#
d。双重投射对象
AgentInfo info =(AgentInfo)(object)rotNativeMethods.GetObject(“BizBrainAgentService.AgentInfo”);
按照Why can't I cast this interface to a concrete class?
e使用as运算符
object obj=rotNativeMethods.GetObject("BizBrainAgentService.AgentInfo");
AgentInfo info=obj as AgentInfo
F。在agentInfoClass上实现IProvideClassInfo和IProvideClassInfo2接口[使用ComImport属性导入它们]
在所有这些尝试之后,我想知道是否可以从COM接口或运行对象表返回COM CoClass,而不是COM接口。
另外,另一个问题是,根据消息,AgentInfo被视为C#/点网类型而不是COM类型。这真的是这样吗?在这种情况下,演员会失败。
我知道返回CoClass而不是接口可能不是一个好习惯,但我需要能够从AgentInfo对象中侦听事件,而这似乎不可能来自接口。
BizBrainAgentService.AgentInfo是如何定义的?您需要访问哪些AgentInfo方法和_IAgentInfo中不可用的方法?
AgentInfo info =(_IAgentInfo) rotNativeMethods.GetObject("BizBrainAgentService.AgentInfo");
您似乎将BizBrainAgentService.AgentInfo转换为接口_IAgentInfo,只要BizBrainAgentService.AgentInfo实现它就可以了。
您无法将其强制转换回AgentInfo,因为对象类型仍为BizBrainAgentService.AgentInfo。
在COM中,QueryInterface用于导航到不同的接口https://docs.microsoft.com/en-us/cpp/atl/queryinterface
您看到的错误解释了这一点 -
Unable to cast COM object of type 'System.__ComObject' to class type 'AgentDLLService.AgentInfo'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.
COM事件是否会使用连接点帮助实现接收器?
以上是关于无法将类型为“System .__ ComObject”的COM对象强制转换为类类型AgentInfo的主要内容,如果未能解决你的问题,请参考以下文章
C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable
无法将 [Struct] 类型的值快速转换为 [string] 类型
无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Micro