COM Interop注册

时间:2009-11-06 03:59:01

标签: c# .net com

我有一个.NET程序集,我正在向COM公开。该程序集有两个公共接口和一个公共类。当我构建程序集时,我收到此警告:

  

(assemblyName.dll)不包含可以为COM Interop注册的任何类型。

我的装配信息包括以下内容。

[assembly: ComVisible(true)]

我发现,大多数人在网络上遇到此问题,并在其装配信息中使用上述行修复了该问题。这对我没有帮助。

我也尝试将[ComVisible(true)]添加到类和接口定义中,它也没有帮助。

5 个答案:

答案 0 :(得分:15)

ComVisible类通常需要有一个公共默认构造函数。其成员通常也应仅引用ComVisible类型。

如果已在程序集级别指定了它,则无需在类上指定ComVisible(true)。

但是,使用ComVisible类生成程序集的常用方法是:

  • 在程序集级别指定ComVisible(false)。因此,只有明确标记为ComVisible(true)的类才会暴露给COM。

  • 定义一个明确的ComVisible接口:

e.g。

[
ComVisible(true),
GuidAttribute("..."),
Description("...")
]
public interface IMyComVisibleType
{
        // members...
     }
  • 您的ComVisible类应指定ClassInterfaceType.None,并应实现ComVisible接口:

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,请遵循上述其他提示之一。