我想鎖定程序集內的類,以阻止它們從同一程序集中的其他類中調用。換句話說,在大會內部不會有橫向的呼叫。確定是否從同一程序集內調用代碼
我打算在類調用中寫一些驗證,以確保它們不在同一個程序集中調用。我如何使用反射來確定它?
所以它的以下情形:
Assembly1
----------
Class 1A
Assembly2
----------
Class 2A
Class 2B
所以2A級不能調用2B類。但1A類可以調用2A類或2B類。
我想鎖定程序集內的類,以阻止它們從同一程序集中的其他類中調用。換句話說,在大會內部不會有橫向的呼叫。確定是否從同一程序集內調用代碼
我打算在類調用中寫一些驗證,以確保它們不在同一個程序集中調用。我如何使用反射來確定它?
所以它的以下情形:
Assembly1
----------
Class 1A
Assembly2
----------
Class 2A
Class 2B
所以2A級不能調用2B類。但1A類可以調用2A類或2B類。
你問的是現有的access modifiers。
您不能將一個類公開給其他程序集,但是內部私有。
如果您將Class2B
拆分爲不同的組件並將其製成internal
,那麼也可以使用set the InternalsVisibleToAttribute
至Assembly1
。
這將實現的是Class2A
不能訪問它,但Class1A
可以。
您還可以使用反射進行一些運行時檢查 - 與Christian.K的the answer一樣。
如何:
if (Assembly.GetCallingAssembly() == Assembly.GetExecutingAssembly())
{
// Throw some exception
}
似乎是一個很奇怪的事情做雖然...
你爲什麼把它們放在同一個組件擺在首位?
寧可將2B和2A放在自己的組件中,將類標記爲internal
。提供彙編級屬性InternalsVisibleTo
以允許「Assembly1」分別訪問「Assembly2B」和「Assembly2A」的內部。
使用反射,你仍然能夠繞過這一點。
無論如何,出於安全目的使用這種機制(或任何其他手段,「調用者檢查」,無論如何)是不可取的。如果你想爲了「建築」目的而使用它,你可以使用上面提到的建議和可能的使用工具,如NDepend或自定義的FxCop/CodeAnalysis規則。您可以驗證您的規則在構建期間不會中斷。
這不就是關鍵字'internal'的用途嗎? –
這聽起來正好倒退到大多數要求。是否允許'Class2A'調用'Class1A',Class1A又調用'Class2B'? –
@juergend - 不可以。它允許您訪問同一個程序集中的類,而不是通過程序集。它也不會在程序集中進行_restrict_訪問。 – Oded