You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现CLR mscorlib::_Assembly接口时报错无法实例化抽象类

错误原因与解决方案

1. 修复继承结构错误

你当前的类存在重复继承、继承权限错误的问题:

  • 重复继承了CComObjectRootEx<CComSingleThreadModel>,会导致编译冲突
  • IDispatchImpl继承未指定public权限,也未传入必要的IID、类型库LIBID参数
  • 无需额外继承IAssembly,IDispatchImpl<IAssembly>已经包含了该接口的继承

修正后的类定义开头:

typedef mscorlib::_Assembly IAssembly;
class CIAssembly :
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IAssembly, &__uuidof(IAssembly), &LIBID_mscorlib>
{

2. 修复COM映射配置

你注释掉了IDispatch接口的映射入口,导致COM框架无法找到IDispatch的实现,取消注释即可:

BEGIN_COM_MAP(CIAssembly)
    COM_INTERFACE_ENTRY(IAssembly)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_objUnk)
END_COM_MAP()

3. 修正方法签名的命名空间匹配问题

报错提示三个方法为抽象,核心原因是你实现的方法参数类型没有补全mscorlib命名空间,编译器判定和基类的纯虚函数签名不匹配,没有实现基类要求的接口:
所有方法中用到的mscorlib库内类型(_Type、_AssemblyName、_MethodInfo等)都要加mscorlib::前缀,示例如下:

// 错误写法
HRESULT STDMETHODCALLTYPE GetType(__out struct _Type * * pRetVal);
// 正确写法
HRESULT STDMETHODCALLTYPE GetType(__out mscorlib::_Type * * pRetVal);

// 另外两个报错方法同理修正
HRESULT STDMETHODCALLTYPE GetName(__out mscorlib::_AssemblyName * * pRetVal);
HRESULT STDMETHODCALLTYPE GetName_2(__in VARIANT_BOOL copiedName, __out mscorlib::_AssemblyName * * pRetVal);

4. 删除多余的IDispatch方法声明

你手动声明的四个IDispatch接口方法(GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、Invoke)已经由IDispatchImpl默认实现,手动声明会导致实现冲突,直接删除这四个方法的声明即可。

完成以上修改后重新编译即可解决抽象类无法实例化的问题。

内容的提问来源于stack exchange,提问作者nopx90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:15:02