我有一个.NET程序集,我正在向COM公开。该程序集有两个公共接口和一个公共类。当我构建程序集时,我收到此警告:
(assemblyName.dll)不包含可以为COM Interop注册的任何类型。
我的装配信息包括以下内容。
[assembly: ComVisible(true)]
我发现,大多数人在网络上遇到此问题,并在其装配信息中使用上述行修复了该问题。这对我没有帮助。
我也尝试将[ComVisible(true)]
添加到类和接口定义中,它也没有帮助。
答案 0 :(得分:15)
ComVisible类通常需要有一个公共默认构造函数。其成员通常也应仅引用ComVisible类型。
如果已在程序集级别指定了它,则无需在类上指定ComVisible(true)。
但是,使用ComVisible类生成程序集的常用方法是:
在程序集级别指定ComVisible(false)。因此,只有明确标记为ComVisible(true)的类才会暴露给COM。
定义一个明确的ComVisible接口:
e.g。
[
ComVisible(true),
GuidAttribute("..."),
Description("...")
]
public interface IMyComVisibleType
{
// members...
}
e.g。
[
ComVisible(true),
GuidAttribute("..."),
ClassInterface(ClassInterfaceType.None)
]
public sealed class MyComVisibleType : IMyComVisibleType
{
// implementation ...
}
请注意,Guid和Description属性不是必需的,但可以帮助您更好地控制COM生成。
如果上述方法无效,请尝试发布一些示例代码,我相信有人可以提供帮助。
答案 1 :(得分:2)
我遇到了默认的构造函数问题。欺骗我的是,类型库文件将包含类GUID引用,即使该类未被注册。查看将要注册的内容的快速方法是创建一个注册表文件('assembly.reg'),如下所示:
regasm assembly.dll /regfile:assembly.reg /codebase
关于在COM Interop: Base class properties not exposed to COM中公开接口的讨论很好。这里有一些示例代码:Exposing .NET Components to COM。
答案 2 :(得分:0)
以下是其他一些事实
ComVisible(true)
属性添加到类型中
Guid
属性不确定最后2个是否是绝对必要的,但我会尝试一下。
答案 3 :(得分:0)
我认为你需要一个强名的集会。您是否使用密钥文件对程序集进行签名?
此外,还尝试指定: [Guid(“{new generated GUID}”)] [ClassInterface(ClassInterfaceType.AutoDual)]
答案 4 :(得分:0)
我在一个项目中遇到了同样的问题,我检查了"注册COM互操作"我的C#项目的选项。有一个简单的解决方案:
在解决方案资源管理器中,转到“属性”文件夹。打开AssemblyInfo.cs
文件。向下滚动到以下行:
[assembly: ComVisible(false)]
将此更改为:
[assembly: ComVisible(true)]
这将删除警告消息,并允许创建.tlb
文件,然后启用.NET代码以实现COM可见性。
如果您不希望整个装配体看到COM,请遵循上述其他提示之一。