Определите, вызывается ли код из той же сборки

Я хотел бы заблокировать классы в моей сборке, чтобы они не вызывались из других классов в той же сборке. Другими словами, никаких боковых вызовов внутри сборки.

Я собирался написать некоторую проверку в вызовах классов, чтобы убедиться, что они не вызываются из одной и той же сборки. Как я могу определить это с помощью отражения?

Итак, это следующий сценарий:

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

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

Таким образом, класс 2A не может вызывать класс 2B. Но класс 1A может вызывать класс 2A или класс 2B.


person Robert McCabe    schedule 02.05.2012    source источник
comment
Разве не для этого предназначено ключевое слово internal?   -  person juergen d    schedule 02.05.2012
comment
Это звучит прямо противоположно большинству требований. Разрешено ли Class2A вызывать Class1A, который, в свою очередь, вызывает Class2B?   -  person Damien_The_Unbeliever    schedule 02.05.2012
comment
@juergend - Нет. Это позволяет вам получать доступ к классам внутри одной сборки, а не между сборками. Он также не ограничивает доступ к сборке.   -  person Oded    schedule 02.05.2012
comment
@juergend - если OP несколько раз серьезно опечатался, похоже, они ищут _1 _...   -  person Damien_The_Unbeliever    schedule 02.05.2012


Ответы (3)


То, о чем вы спрашиваете, невозможно с существующими модификаторами доступа.

Вы не можете сделать класс общедоступным для других сборок, но внутренне закрытым.

Если вы разделите свой Class2B на другую сборку и сделаете его internal , вы также можете установить InternalsVisibleToAttribute на Assembly1.

Это приведет к тому, что Class2A не сможет получить к нему доступ, но Class1A сможет.


Вы также можете выполнить некоторые проверки во время выполнения, используя отражение - как ответ от Christian.K details.

person Oded    schedule 02.05.2012

Почему вы вообще ставите их в одну сборку?

Скорее поместите 2B и 2A в собственные сборки, пометив классы как internal. Они предоставляют атрибут уровня сборки InternalsVisibleTo, чтобы позволить «Assembly1» получить доступ к внутренним компонентам «Assembly2B» и «Assembly2A» соответственно.

Используя отражение, вы все равно сможете обойти это.

В любом случае использование такого механизма (или любого другого, созданного вручную "проверки вызывающего абонента" и т. Д.) В целях безопасности не рекомендуется. Если вы хотите сделать это в «архитектурных» целях, вы можете использовать то, что было предложено выше, и возможные инструменты, такие как NDepend. или настраиваемое правило FxCop / CodeAnalysis. Вы можете убедиться, что ваши правила не нарушаются во время сборки.

person Christian.K    schedule 02.05.2012

Как насчет:

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

Хотя это кажется довольно странным ...

person Matthew Watson    schedule 02.05.2012