2009-08-29 21 views
12

Estoy leyendo el libro de Bill Wagner Effective C#. En el ítem 32 él aboga por que los desarrolladores creen conjuntos más pequeños y cohesivos que puedan reutilizarse más fácilmente. Sin embargo, en ese mismo artículo dice:.NET Cross-Assembly Performance Hit

... Los controles de seguridad extra también son realizados a través de los límites del ensamblaje. Todo código del mismo ensamblado mismo tiene el mismo nivel de confianza (no necesariamente los mismos derechos de acceso, pero el mismo nivel de verdad). El CLR realiza algunas comprobaciones de seguridad cuando el flujo de código cruza un límite de ensamblaje. El menor número de veces que el flujo del programa cruza montaje límites, más eficiente será ser ... Ninguna de estas prestaciones preocupación que deben desistir de romper asambleas que son demasiado grandes . Las sanciones de rendimiento son menor.

Mi pregunta es ¿se realizan comprobaciones de seguridad adicionales para cada llamada a método en Foo.dll, o solo la primera vez que se carga el ensamblado?

Gracias

+0

@Andrew: Listo. – dewald

Respuesta

12

El sistema de seguridad en .NET es bastante complejo. No estoy seguro de que la respuesta sea tan simple como puede parecer a primera vista. Incluso en el caso de que tenga un ensamblaje único, las comprobaciones de seguridad aún se realizan. Cuando inicia una aplicación que tiene toda la lógica en un solo .exe, no omite las comprobaciones de seguridad de .NET para la carga y verificación del ensamblaje, ni omite las comprobaciones de tipo de herencia. Sin embargo, una vez que la seguridad ha sido verificada para un alcance determinado, generalmente no ocurre nuevamente (puede haber algunas circunstancias atenuantes que obligarían a volver a verificar la evidencia).

Los ensambles múltiples no se comportarán de manera diferente. Puede haber algún costo de carga de ensamblaje adicional y costo de acceso de tipo inicial, ya que cada ensamblaje nuevo requerirá esas comprobaciones de seguridad iniciales. Sin embargo, esos controles generalmente palidecerán en comparación con el proceso de JITting el código mismo.

Más allá de la carga del ensamblaje básico y las comprobaciones de seguridad del tipo, también puede tener demandas de permisos explícitos. Microsofts Los espacios de nombres del sistema están plagados de Demand y de comprobaciones de seguridad de LinkDemand que verifican que todos los que llaman suban la pila (demanda) o que la persona que llama inmediatamente (demanda de enlace) tenga permiso para realizar la llamada. (Su código también debe incluir tales comprobaciones para validar que las personas que llaman también cuenten con el permiso correspondiente). Estas verificaciones de seguridad se realizarán independientemente de dónde viva el código ... localmente, en otro ensamblado o incluso en un ensamblado en otro dominio de aplicación . Sin embargo, una vez que ingresa en llamadas hechas a otros dominios o procesos de aplicaciones, o incluso a servicios y otros servidores, la carga de ordenar esas llamadas y hacer conexiones es mucho más costosa.

Esto ni siquiera es la imagen completa en lo que respecta a la seguridad de .NET. Algunos controles de seguridad son más costosos que otros. Algunos requieren una credencial, otros requieren evidencia, etc. La seguridad no es algo que se pueda eludir ... es un componente esencial y crítico del desarrollo de software moderno. No me preocuparía tanto por el costo de la seguridad ... ya que está bien implementado y bien optimizado en .NET framework y CLR. Me gustaría esforzarme para garantizar que su aplicación esté correctamente estructurada y organizada.Si es lógico separar el código en varios ensambles, se reduce el esfuerzo de mantenimiento, despliegue y refactorización, entonces vale la pena el pequeño costo adicional para la seguridad.

4

Esos controles de seguridad se realizan cuando el CLR carga el ensamblado. Una vez que se ha cargado el ensamblaje, no se necesitan más controles de seguridad.

4

también leer el pasaje en el libro de Bill Wagner y tenía las mismas dudas sobre el rendimiento, por lo que como punto de referencia la aplicación que estamos desarrollando actualmente:

Hay unos cientos de miles hasta 3-4 millones de llamadas a una de nuestras clases C#.

No importa si esta clase está en el mismo conjunto o en otro conjunto, siempre que se encuentren en la misma máquina en el mismo proceso y dominio. ¡No pude medir ninguna penalización de rendimiento significativa!

Por supuesto, si las llamadas necesitan ser ordenadas, las cosas son diferentes. Tal vez muy diferente ...