2009-08-29 1 views
12

Я читаю книгу Билла Вагнера Эффективный C#. В пункте 32 он выступает за то, чтобы разработчики создавали более мелкие, более сплоченные сборки, которые можно было бы повторно использовать с большей готовностью. Однако в этом же пункте он говорит:.NET Производительность кросс-сборки Hit

... Дополнительные проверки безопасности также являются , выполненными через границы сборок. Все код из той же сборки тот же уровень доверия (не обязательно те же права доступа, , но тот же уровень правды). Среда CLS выполняет некоторые проверки безопасности всякий раз, когда поток кода пересекает узел . Чем меньше раз ваш поток программы пересекает сборочные границ, тем более эффективных будет быть ... Ни один из этой производительности проблемы должны отговорить вас от разбивая сборки, которые слишком большие. Пункты исполнения: minor.

Мой вопрос: есть ли дополнительные проверки безопасности, выполняемые для каждого вызова метода в Foo.dll, или только при первой загрузке сборки?

Благодаря

+0

@ Andrew: Done. – dewald

ответ

12

Система безопасности в .NET довольно сложна. Я не уверен, что ответ такой простой, как может показаться на первый взгляд. Даже если у вас есть одна сборка, проверки безопасности все еще выполняются. Когда вы запускаете приложение, имеющее всю логику в одном .exe, вы не обходите проверки безопасности .NET для загрузки и проверки сборки и не обходите проверки типа наследования. Однако, как только безопасность будет проверена для данной области действия, она обычно не повторится (могут быть некоторые смягчающие обстоятельства, которые заставили бы повторную проверку доказательств.)

Несколько сборок не будут вести себя иначе. Могут быть некоторые дополнительные затраты на сборку и стоимость доступа к первому типу, так как каждая новая сборка потребует этих первоначальных проверок безопасности. Тем не менее, эти проверки, как правило, бледнеют по сравнению с процессом JIT-кода.

Помимо контрольных проверок загрузки и типа базовой сборки, вы также можете иметь явные требования к разрешению. Пространства имен Microsoft System пронизаны проверками безопасности Demand и LinkDemand, которые подтверждают, что все вызывающие абоненты в стеке (спрос) или непосредственный вызывающий абонент (запрос на связь) имеют разрешение на выполнение вызова. (В ваш код также должны включаться такие проверки, которые были бы пригодны для подтверждения того, что у вызывающих есть соответствующее разрешение.) Эти проверки безопасности будут происходить независимо от того, где код живет ... локально, в другой сборке или даже в сборке в другом домене приложения , Однако, как только вы попадаете в вызовы, сделанные в других доменах приложений или процессах, или даже на сервисы и другие серверы, накладные расходы на марширование этих вызовов и подключение к ним на порядок дороже.

Это даже не вся картина, когда дело доходит до обеспечения безопасности .NET. Некоторые проверки безопасности являются более дорогостоящими, чем другие. Некоторые требуют учетных данных, другие требуют доказательств и т. Д. Безопасность - это не то, что вы можете уклониться от нее ... ее важнейшим и важным компонентом современной разработки программного обеспечения. Я бы не стал так беспокоиться о стоимости безопасности ... поскольку он хорошо реализован и хорошо оптимизирован в .NET framework и CLR. Я бы постарался обеспечить правильное архивирование и организацию вашего приложения.Если разделение кода на несколько сборок логично, это уменьшает затраты на обслуживание, развертывание и рефакторинг, тогда его WELL стоит небольшая дополнительная стоимость для обеспечения безопасности.

4

Эти проверки безопасности сделаны, когда CLR загружает сборку. После того, как сборка загружена, дальнейших проверок безопасности не требуется.

4

Я также прочитал отрывок из книги Билла Вагнера и был то же сомнение производительности, поэтому я протестировал приложение, которое мы разрабатываем в настоящее время:

Есть несколько сот тысяч до 3-4 миллионов звонков в один из наших классов C#.

Не имеет значения, находится ли этот класс в той же сборке или в другой сборке, если они находятся на одной машине в одном и том же процессе и в домене. Я не мог измерить какое-либо значительное снижение производительности!

Конечно, если звонки должны быть маршализованы, все по-другому. Может быть, совсем другое ...

 Смежные вопросы

  • Нет связанных вопросов^_^