COM互操作註冊
回答
標記有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生成很有用。
如果以上內容無效,請嘗試發佈一些示例代碼,我相信有人能夠提供幫助。
我碰到了默認的構造函數問題。我愚蠢的是類型庫文件將包含類GUID引用,即使該類沒有被註冊。一個快速的方法,看看有什麼會被註冊是創建這樣一個註冊表文件(「assembly.reg」):
regasm assembly.dll /regfile:assembly.reg /codebase
有一個在COM Interop: Base class properties not exposed to COM暴露接口的一個很好的討論。一些示例代碼在這裏:Exposing .NET Components to COM。
我在一個項目中遇到了同樣的問題,我在C#項目中選中了「Register for COM interop」選項。有一個簡單的解決方案:
在解決方案資源管理器中,轉到屬性文件夾。打開AssemblyInfo.cs
文件。向下滾動到這行: [assembly: ComVisible(false)]
更改爲: [assembly: ComVisible(true)]
這將刪除的警告信息,並允許.tlb
文件被創建,然後使.NET代碼COM知名度。
如果您不希望整個組件是COM可見的,請按照上述其他提示之一操作。
- 1. 使用註冊免費COM激活(基於COM互操作的)ActiveX控件com
- 2. 註冊免COM類似的互操作和線程
- 3. 註冊免費COM與C#互操作,可能嗎?
- 4. 免費註冊COM互操作。組件B參考組件A?
- 5. COM互操作性混淆
- 6. VBA COM互操作問題
- 7. 從ASP.NET的COM互操作
- 8. C#COM互操作庫
- 9. COM互操作問題
- 10. COM互操作不regasm
- 11. 跨用戶COM互操作
- 12. ASP.NET和COM互操作
- 13. 調用COM wituout COM互操作dll
- 14. 如何獲得免註冊COM的託管/非託管互操作
- 15. 使用註冊探測.NET程序集免費的COM/.NET互操作程序
- 16. 免費註冊COM互操作初始化 - 參數的構造函數
- 17. COM互操作錯誤,沒有註冊類使用MSMQ圖書館
- 18. arcgis com註冊
- 19. 新註冊操作
- 20. .NET中無註冊COM互操作的具體步驟(調用無regsvr32複製COM DLL)
- 21. com類庫註冊
- 22. 註冊爲COM Interop
- 23. COM互操作性和繼承
- 24. WCF服務和COM互操作回調
- 25. 反思COM互操作對象
- 26. VB.Net互操作的Excel COM異常
- 27. C#中的COM互操作問題#
- 28. COM對象excel互操作清理
- 29. x86與COM互操作編譯在x64
- 30. VBA/C#COM互操作 - 錯誤430
忘記添加一個默認的構造函數有時會發生,所以+1會提到它。 – 2009-11-06 11:00:10
然而,添加一個公共的默認構造函數並沒有實現這個功能,這個類只能從.net代碼構建。這是沒有提供公共默認構造函數的原因。我認爲這個警告也會出現在只包含接口的程序集中。 – trampster 2009-11-08 21:26:08
是的,對於只有接口的程序集,您將得到相同的警告。我想它與VB6 ActiveX DLL必須至少包含一個公開創建類的方式類似。但是,在.NET世界中似乎有不必要的限制,因爲您可以通過託管代碼構建一個類並將其傳遞給COM組件,例如作爲方法的參數。 – Joe 2009-11-09 06:31:00