簡體   English   中英

如何將“通用”C# 集合公開給 COM

[英]How to expose "generic" C# collection to COM

我有一個 API,我開發了一個 C# 客戶端,將 HTTP GET 請求轉換為 C# 對象。

我已經在 VB6 中使客戶端 COM 可見,因為我需要它,這里的問題是通用 collections 不能在 COM 上工作。我已經通過自己實現一個集合來解決這個問題,除了它不是通用的。

這意味着我的每個類都有一個名為[Class] _Collection 的 class,這僅意味着我有一個沒有通用 class 的集合。

這很好用,除了我們的 API 很大,有很多不同的對象,所以如果我不必為我們的 API 中的每個 class 編寫實現,那就太好了。

我一直在嘗試使用通用基礎 class 或我可以繼承的通用接口,但如前所述,COM 不喜歡通用類。 我還需要一個 IDispatch 接口來公開功能,以便在 VB6 中公開 class 函數。

有沒有一種方法可以為我的所有 collections 編寫實現,並在需要的地方繼承該功能?

Generics 確實與 COM 不兼容,據我所知,這個限制本身是沒有辦法解決的。

我用作簡單解決方法的方法是添加專門用於 COM 互操作目的的包裝器屬性。

例子:

[ComVisible(false)]
public List<int> SomeNumbers {get; set;}

[ComVisible(true)]
[Obsolete("Use this for COM interop only")]
public IList SomeNumbersCOM => SomeNumbers;

這樣做的好處是相當簡單,實際上不會復制任何數據,並且可以通過 COM 運行。但是它顯然不是類型安全的,因為在 VB6 中, SomeNumbersCOM的條目看起來只是object 但是 VB6 無論如何都不是特別安全的,所以這可能不是什么大問題。 至少真正的強類型集合可以在 C# 中使用Obsolete有助於加強這一點。

根據我的經驗,類型安全性的輕微損失並不是真正的問題。 您仍然可以在 VB 端斷言正確的類型; 例如,從SomeNumbersCOM列表中獲取值時使用Long變量。

您不必添加太多不只是樣板的代碼。 例如,您不必實際編寫集合類代碼或復制它們的內部邏輯。


您可以創建一個完整的包裝器 class,而不是在同一個 class 中包裝屬性,這對於 C# 消費者來說會更干凈一些。

創建一個完全獨立的 COM 可見性包裝器程序集(其中包含所有這些包裝器類)將是強制不從 C# 端的其他地方使用包裝器的更強大的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM