2009-11-06 143 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可見的,請按照上述其他提示之一操作。