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

Python3.9调用.NET6.0 COM对象报No such interface supported错误如何解决

.NET 6 COM库在Python 3.9调用失败的排查与解决方案
  • 修正COM注册对象
    .NET 6 生成的COM库不能直接注册项目生成的业务DLL,必须注册生成产物里的[你的项目名].comhost.dll,这是.NET 6 提供的COM主机代理,负责运行时加载.NET runtime并激活你的COM对象。你之前如果直接注册了自己编写的ComTest.dll,即使注册表有条目,实际激活时也会找不到正确的接口实现。
    清理原有注册:regsvr32 /u 原注册的dll路径,重新注册comhost:regsvr32 [你的项目名].comhost.dll。另外注意编译COM库时不要使用Any CPU平台,要明确指定和你Python环境一致的x86或x64平台。
  • 补充C# COM类的接口配置
    你的ComTest类缺少ClassInterface显式声明,默认配置可能会生成自动类接口,和你定义的IDispatch接口冲突,导致Python端找不到对应接口。修改类定义如下:
[ComVisible(true)]
[Guid(AssemblyInfo.ClassGuid)]
[ProgId("ComTest")]
[ClassInterface(ClassInterfaceType.None)] // 新增这一行
public class ComTest : IComTest
{
    public double SomeMethod(double param1, double param2, string param3)
    {
        // implementation
    }
}

重新编译后再注册comhost.dll。

  • 调整Python端Dispatch的上下文参数
    win32com默认的类激活上下文可能和进程内COM服务器不匹配,修改Python代码显式指定进程内激活上下文,同时可以尝试使用gencache提前生成类型包装避免动态调用异常:
import win32com.client
import pythoncom

def Init():
    # 可选:提前生成类型缓存,避免动态Dispatch的兼容问题
    # win32com.client.gencache.EnsureDispatch("ComTest", clsctx=pythoncom.CLSCTX_INPROC_SERVER)
    test = win32com.client.Dispatch("ComTest", clsctx=pythoncom.CLSCTX_INPROC_SERVER)
    test.SomeMethod(1, 2, "test")

if __name__ == "__main__":
    Init()
  • 清理win32com的旧类型缓存
    win32com会在本地缓存COM类型的包装代码,旧缓存可能导致调用异常。打开路径%temp%\gen_py\3.9,删除该目录下所有和你的COM库相关的文件夹,再重新运行脚本即可。
  • 清理注册表残留
    如果之前有过不同版本的同ProgId、同GUID的COM注册记录,可能存在注册表冲突。打开注册表编辑器,分别搜索你的ProgId(ComTest)、类Guid、接口Guid,删除所有相关的条目后再重新注册comhost.dll。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:15:03