2012-05-02 48 views
1

我想鎖定程序集內的類,以阻止它們從同一程序集中的其他類中調用。換句話說,在大會內部不會有橫向的呼叫。確定是否從同一程序集內調用代碼

我打算在類調用中寫一些驗證,以確保它們不在同一個程序集中調用。我如何使用反射來確定它?

所以它的以下情形:

Assembly1 
---------- 
Class 1A 

Assembly2 
---------- 
Class 2A 
Class 2B 

所以2A級不能調用2B類。但1A類可以調用2A類或2B類。

+0

這不就是關鍵字'internal'的用途嗎? –

+0

這聽起來正好倒退到大多數要求。是否允許'Class2A'調用'Class1A',Class1A又調用'Class2B'? –

+0

@juergend - 不可以。它允許您訪問同一個程序集中的類,而不是通過程序集。它也不會在程序集中進行_restrict_訪問。 – Oded

回答

2

你問的是現有的access modifiers

您不能將一個類公開給其他程序集,但是內部私有。

如果您將Class2B拆分爲不同的組件並將其製成internal,那麼也可以使用set the InternalsVisibleToAttributeAssembly1

這將實現的是Class2A不能訪問它,但Class1A可以。


您還可以使用反射進行一些運行時檢查 - 與Christian.K的the answer一樣。

0

如何:

if (Assembly.GetCallingAssembly() == Assembly.GetExecutingAssembly()) 
{ 
    // Throw some exception 
} 

似乎是一個很奇怪的事情做雖然...

1

你爲什麼把它們放在同一個組件擺在首位?

寧可將2B和2A放在自己的組件中,將類標記爲internal。提供彙編級屬性InternalsVisibleTo以允許「Assembly1」分別訪問「Assembly2B」和「Assembly2A」的內部。

使用反射,你仍然能夠繞過這一點。

無論如何,出於安全目的使用這種機制(或任何其他手段,「調用者檢查」,無論如何)是不可取的。如果你想爲了「建築」目的而使用它,你可以使用上面提到的建議和可能的使用工具,如NDepend或自定義的FxCop/CodeAnalysis規則。您可以驗證您的規則在構建期間不會中斷。

相關問題