VS2017 .NET项目COM互操作:部分公共类未暴露至COM求助
我碰到过好几个类似的情况,你这个问题大概率是代码层面或工具使用的几个常见问题导致的,咱们一步步排查:
检查单个类的COM可见性设置
虽然你已经勾选了程序集级别的“Make assembly COM-visible”,但每个类默认会继承这个设置,不过如果某个公共类被手动标记了[ComVisible(false)],那它就不会被暴露到COM中。打开那些没被暴露的类(比如xyz)的代码,确认没有显式设置这个特性,或者直接给它加上[ComVisible(true)]明确声明。确保类有无参数的公共构造函数
COM规范要求可实例化的类必须提供一个无参数的公共构造函数。如果你的某个公共类只有带参数的构造函数,Regasm会跳过导出这个类到TLB和注册表。比如如果bar类的构造函数是public bar(int value),那你得加一个public bar()的无参构造函数(哪怕是空实现)。排除抽象类或静态类的情况
COM不支持抽象类(abstract)和静态类(static)的实例化,所以这类公共类即使程序集设置了COM可见,也不会被注册和暴露。检查那些没出现的类是不是被标记为abstract或者static了,如果是,要么修改类的类型,要么如果不需要在COM中使用,就保持现状即可。检查基类的COM可见性
如果你的公共类继承了自定义的基类,那这个基类也必须标记为[ComVisible(true)],否则子类无法被COM识别。比如foo类继承了aa.bb.BaseClass,那BaseClass也要设置COM可见;如果基类是.NET自带的(比如Object),那没问题。确认Regasm的版本匹配项目的.NET框架
不同版本的Regasm对应不同的.NET Framework版本,比如你的项目是.NET Framework 4.7.2,那你得用C:\Windows\Microsoft.NET\Framework\v4.0.30319\Regasm.exe(64位项目用Framework64路径)。如果用了旧版本的Regasm(比如v2.0的),可能会因为兼容性问题导致部分类没被正确导出。检查TLB文件内容验证问题源头
可以用VS自带的OleView.exe(或者Windows SDK中的工具)打开生成的test.tlb,查看里面是否包含那些没暴露的类:- 如果TLB里没有,说明问题出在代码层面,回到前面的几点排查;
- 如果TLB里有但注册表没有,那大概率是注册时的权限问题,尝试以管理员身份运行命令提示符再执行
regasm /codebase /tlb:test.tlb。
内容的提问来源于stack exchange,提问作者user2838966

