2009-06-19 90 views
3

我正在用C#編寫一個類庫(IE BHO),目前正在與我認爲是來自REGASM生成的註冊表項的垃圾輸出的大量文件爭吵。C#:Regasm爲我的COM DLL中的每個類生成註冊表項?

簡短的版本是這樣的:我只想向IE(以及COM的其餘部分)展示一些類(當前:一類)。只有一個類具有ClassInterfaceAttribute和GUID設置,我可以測試該附加組件只需要此類的COM註冊表項,然而,REGASM爲整個項目中的每個類生成GUID和註冊表項。

這很煩人,有點令人不安,因爲我不想讓我的班級名稱坐在用戶的註冊表中,除非他們絕對有在那裏。

爲了公平起見,許多那些其他類的標註公衆,因爲我在驅動程序的應用程序在同一個解決方案中使用它們從另一個項目,來解決IE的調試黑洞......

我仍然一般來說,COM對於COM來說是非常綠色的(特別是與.Net有關),我想知道什麼是最好的方法來隱藏我所有的其他課程?或者至少,爲什麼當我沒有爲他們設置任何COM標誌時,這些類(即使它們被標記爲公開的)顯示出來?

謝謝!

+0

正如此處所述:http:// stackoverflow。com/questions/1099067 /瀏覽器輔助對象的部署 - 你真的不應該使用.NET來構建生產Internet Explorer擴展。原型設計很好,但不應該部署到客戶機器上。 – EricLaw 2009-07-23 21:44:46

回答

5

使用internal訪問修飾符的東西,不需要有public修飾符。對於真正需要public訪問的內容,請使用ComVisible屬性來部分隱藏它。

例如:

[ComVisible(false)] 
public class ClassToHide { 
    //whatever 
}; 

public class ClassToExpose { 

    public void MethodToExpose() {} 

    [ComVisible(false)] 
    public void MethodToHide() {} 
}; 

的所有公共成員函數和所有公共類的成員變量在默認情況下COM可見。所以首先考慮讓它們成爲內部的,如果你真的需要它們,公開用ComVisible將它們從COM中隱藏起來。

+0

只是想讓你知道這工作就像一個魅力。謝謝:-)但是,我注意到ComVisible指令似乎忽略了類內的枚舉......不是一個大問題,但我覺得有點奇怪。 – 2009-06-20 10:06:09

2

嘗試使用/ regfile開關 - 這將輸出一個reg文件,而不是直接將所有類名寫入註冊表。

如果您有.reg文件,則可以刪除不想添加到目標系統註冊表的任何條目,並僅將這些值部署到目標計算機。根據您選擇部署軟件的方式,這可能更容易,您不必更改任何類型的代碼。

事實上,如果你沒有訪問源代碼,這將是實現這一目標的唯一方法。

+1

ComVisible屬性是解決方案。你的建議是當源代碼不可用時的情況的解決方法。 – sharptooth 2009-06-19 08:24:58

2

我寫了一個具有相同問題的COM組件。

我把所有的非COM函數分隔成一個獨立的helper DLL。 COM DLL只包含需要註冊的代碼。通過輔助DLL訪問其他所有內容。

我發現一個簡單的方法可以確保未來的代碼不會被意外標記爲public而不是internal並顯示在註冊表中。

1

在AssemblyInfo文件中將ComVisible屬性設置爲false,並將Set ComVisible設置爲僅適用於所需的類。

相關問題