2009-10-30 96 views
1

我有一個C#程序集,用作非託管C++應用程序使用的進程內COM服務器。程序集消耗了一個不會改變的web服務,所以不需要更新web服務代理類。這就是爲什麼代理類被創建一次並且Reference.cs文件被簡單地放入存儲庫並且僅從那裏編譯。如何優雅地防止Web服務代理暴露給COM?

問題是,默認情況下,web服務代理類是公共的,因此暴露給COM。這膨脹了typelib和污染註冊表。改變內部可見性打破了程序集,因此這些實體需要保持公開,但不需要暴露給COM。

裝聾作啞的方法是接近每一個公共接口/類的Reference.cs文件,並用

[System.Runtime.InteropServices.ComVisible(false)] 

標記它之後,它不再暴露在COM。

有沒有更好的方法?

回答

3

你可以

  • 紀念集會本身不被ComVisible,然後明確標記要暴露給COMComVisible所有接口/類/枚舉。
  • 使用第二個文件和部分類,以紀念你的代理類型是ComVisible(false)

    [System.Runtime.InteropServices.ComVisible(false)] 
    partial class YourProxyType {} 
    
    [System.Runtime.InteropServices.ComVisible(false)] 
    partial class AnotherProxyType {} 
    
+0

請你第一個選項詳細點嗎?我只有一個程序集,reference.cs文件與我的代碼一起編譯到它中。 – sharptooth 2009-10-30 13:19:26

+0

是的,但是你可以用ComVisible(true)標記所有的類,它們通過COM實際上是有意義的。 OTOH,因爲你說你的WSDL代理是非常靜態的(API方式),所以你最好用一個部分類型文件來標記它的所有類是ComVisible(false)。 這樣,您仍然可以重新生成它,因爲您實際上並未觸及自動生成的文件。 – 2009-10-30 13:30:53

+0

我明白了。有用。我在第一個選項中詳細闡述了答案。 – sharptooth 2009-10-30 13:53:58