(assemblyName.dll) 不包含任何可以注册为COM互操作的类型。
我的程序集信息包括以下行。
[assembly: ComVisible(true)]
我发现大多数在网上遇到这个问题的人都通过在程序集信息中添加上述代码行来解决。但这对我没有帮助。
我还尝试在类和接口定义中添加[ComVisible(true)]
,但也没有帮助。
ComVisible的类通常需要一个公共的默认构造函数。其成员通常也只引用ComVisible类型。
如果您已经在程序集级别上指定了ComVisible(true),则不需要在类上指定。
然而,生成包含ComVisible类的程序集的通常方法是:
在程序集级别上指定ComVisible(false)。因此,只有明确标记为ComVisible(true)的类才会暴露给COM。
定义一个明确的ComVisible接口:
例如:
[
ComVisible(true),
GuidAttribute("..."),
Description("...")
]
public interface IMyComVisibleType
{
// members...
}
例如:
[
ComVisible(true),
GuidAttribute("..."),
ClassInterface(ClassInterfaceType.None)
]
public sealed class MyComVisibleType : IMyComVisibleType
{
// implementation ...
}
请注意,Guid和Description属性不是必需的,但可以让您更好地控制COM生成。
如果以上内容无法帮助您,请尝试发布一些示例代码,我相信有人能够帮助您。
我遇到了默认构造函数的问题。让我困惑的是,即使该类没有被注册,类型库文件仍将包含类GUID引用。查看将要注册的内容的快速方法是创建一个名为“assembly.reg”的注册表文件,如下所示:
regasm assembly.dll /regfile:assembly.reg /codebase
在COM Interop: Base class properties not exposed to COM中有一次关于接口暴露的很好的讨论。这里提供了一些示例代码:将.NET组件公开给COM。
以下是一些其他需要注意的事项:
ComVisible(true)
特性Guid
特性不确定最后两个是否严格必要,但建议尝试。
我认为你需要一个强名称程序集。你有用密钥文件签名程序集吗?
此外,还可以尝试指定: [Guid("{新生成的 GUID}")] [ClassInterface(ClassInterfaceType.AutoDual)]
在我的 C# 项目中勾选“注册 COM 互操作”的选项后,我遇到了同样的问题。这有一个简单的解决方案:
在解决方案资源管理器中,进入属性文件夹。打开AssemblyInfo.cs
文件。滚动到一行上面写着:
[assembly: ComVisible(false)]
将其更改为:
[assembly: ComVisible(true)]
这将消除警告消息,并允许创建.tlb
文件,从而使.NET代码对COM可见。
如果您不想使整个程序集支持COM,则可以按照其他提示之一进行操作。