2009-11-06 142 views
6

我有一个.NET程序集,我正在接触COM。该程序集有两个公共接口和一个公共类。当我构建程序集时,出现以下警告:COM互操作注册

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

我的程序集信息包括以下行。

[assembly: ComVisible(true)] 

大多数在网上有这个问题的人,我发现,在他们的程序集信息中用上面的行修正了它。这对我没有帮助。

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

回答

15

标记有ComVisible特性类通常需要有一个公共默认构造。其成员通常也应引用ComVisible类型。

如果您在程序集级别指定了ComVisible(true),则不需要在该类上指定ComVisible(true)。

然而,标记有ComVisible特性类来生成一个组件的通常的方法是:

  • 在组件级别指定标记有ComVisible特性(假)。因此,只有显式标记为ComVisible(true)的类才会暴露给COM。

  • 定义明确的标记有ComVisible特性接口:

例如

[ 
ComVisible(true), 
GuidAttribute("..."), 
Description("...") 
] 
public interface IMyComVisibleType 
{ 
     // members... 
    } 
  • 你的标记有ComVisible特性类应指定ClassInterfaceType.None,并应落实标记有ComVisible特性的接口:

例如

 [ 
    ComVisible(true), 
    GuidAttribute("..."), 
    ClassInterface(ClassInterfaceType.None) 
    ] 
    public sealed class MyComVisibleType : IMyComVisibleType 
    { 
     // implementation ... 
    } 

请注意,Guid和Description属性不是必需的,但对于更好地控制COM生成很有用。

如果以上内容无效,请尝试发布一些示例代码,我相信有人能够提供帮助。

+1

忘记添加一个默认的构造函数有时会发生,所以+1会提到它。 – 2009-11-06 11:00:10

+1

然而,添加一个公共的默认构造函数并没有实现这个功能,这个类只能从.net代码构建。这是没有提供公共默认构造函数的原因。我认为这个警告也会出现在只包含接口的程序集中。 – trampster 2009-11-08 21:26:08

+0

是的,对于只有接口的程序集,您将得到相同的警告。我想它与VB6 ActiveX DLL必须至少包含一个公开创建类的方式类似。但是,在.NET世界中似乎有不必要的限制,因为您可以通过托管代码构建一个类并将其传递给COM组件,例如作为方法的参数。 – Joe 2009-11-09 06:31:00

0

这里有一些其他的事情要真正

  • 确保您要注册标记为公共类型
  • 直接在另外ComVisible(true)属性添加到类型组装
  • 添加Guid属性

不知道是否最后2是严格必要的,但我会试用它们。

+0

GUID在构建时基于具有完全限定的类名和包含该类的程序集的标识而生成。即没有必要自己做这个。 – trampster 2009-11-06 04:20:16

+0

尝试ComVisable(真)在类型+双检查类型是公开的。仍然没有运气。 – trampster 2009-11-06 04:26:50

+0

如何为每个暴露的类添加一个GUID属性? – Beached 2009-11-06 04:53:26

0

我认为你需要一个强大的命名组件。你是否用密钥文件签署你的程序集?

此外,还尝试指定: [的Guid( “{新生成GUID}”)] [ClassInterface(ClassInterfaceType.AutoDual)]

+0

不,我没有,但它并不需要强壮命名我有其他.net程序集为com互操作,并没有命名。 – trampster 2009-11-06 05:31:33

+0

忘了提及它还必须有一个默认的无参数公共构造函数。 – logicnp 2009-11-06 08:13:51

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

0

我在一个项目中遇到了同样的问题,我在C#项目中选中了“Register for COM interop”选项。有一个简单的解决方案:

在解决方案资源管理器中,转到属性文件夹。打开AssemblyInfo.cs文件。向下滚动到这行: [assembly: ComVisible(false)]

更改为: [assembly: ComVisible(true)]

这将删除的警告信息,并允许.tlb文件被创建,然后使.NET代码COM知名度。
如果您不希望整个组件是COM可见的,请按照上述其他提示之一操作。