2009-08-29 5 views
12

Je lis le livre de Bill Wagner En vigueur C#. Au point 32, il préconise aux développeurs de créer des assemblages plus petits et plus cohérents qui peuvent être réutilisés plus facilement. Cependant, dans le même article, il dit:.NET Croix-Assemblée Performance Hit

... Les vérifications de sécurité supplémentaires sont également effectuées à travers les limites de l'assemblage. Tous code du même assemblage même a le même niveau de confiance (pas nécessairement les mêmes droits d'accès, mais le même niveau de vérité). Le CLR effectue des vérifications de sécurité chaque fois qu'un flux de code traverse une limite d'assemblage . Les moins de fois votre flux de programme traverse l'assemblage limites, plus il est efficace être ... Aucun de ces performances préoccupations devraient vous dissuader de briser les assemblées qui sont trop grandes . Les pénalités de performance sont mineures.

Ma question est: y at-il des contrôles de sécurité supplémentaires effectués pour chaque appel de méthode dans Foo.dll, ou seulement la première fois que l'assembly est chargé?

Merci

+0

@Andrew: Fait. – dewald

Répondre

12

Le système de sécurité dans .NET est assez complexe. Je ne suis pas sûr que la réponse soit aussi simple que cela puisse paraître à première vue. Même dans le cas où vous avez un seul assemblage, des contrôles de sécurité sont toujours effectués. Lorsque vous démarrez une application qui a toute la logique dans un fichier .exe unique, vous ne contournez pas les contrôles de sécurité .NET pour le chargement et la vérification de l'assembly, ni ne contournez les contrôles d'héritage de type. Cependant, une fois la sécurité vérifiée pour une portée donnée, elle ne se reproduit généralement plus (il peut y avoir des circonstances atténuantes qui forceraient une nouvelle vérification des preuves.)

Les assemblages multiples ne se comporteront pas différemment. Il peut y avoir des coûts de charge d'assemblage et des coûts d'accès de type initiaux supplémentaires, car chaque nouvel assemblage nécessitera ces contrôles de sécurité initiaux. Cependant, ces contrôles seront généralement pâles en comparaison avec le processus de JITting le code lui-même. Au-delà de la charge d'assemblage de base et des contrôles de sécurité de type, vous pouvez également avoir des demandes d'autorisation explicites. Les espaces de noms du système Microsoft sont criblés de contrôles de sécurité Demand et LinkDemand qui vérifient tous les appelants dans la pile (demande) ou l'appelant immédiat (demande de lien) sont autorisés à passer l'appel. (Votre code devrait également inclure de telles vérifications étaient appropriées pour valider les appelants ont également la permission appropriée.) Ces contrôles de sécurité se produiront indépendamment de l'endroit où le code vit ... localement, dans un autre assembly, ou même dans un assembly dans un autre domaine d'application . Cependant, une fois que vous recevez des appels vers d'autres domaines ou processus d'application, ou même vers des services et d'autres serveurs, le coût de la gestion de ces appels et des connexions est plus élevé.

Il ne s'agit même pas de l'image complète en matière de sécurité .NET. Certaines vérifications de sécurité sont plus coûteuses que d'autres. Certains exigent un justificatif d'identité, d'autres exigent des preuves, etc. La sécurité n'est pas quelque chose que vous pouvez esquiver ... c'est une composante essentielle et essentielle du développement de logiciels modernes. Je ne m'inquiéterais pas autant du coût de la sécurité ... car il est bien implémenté et bien optimisé dans le framework .NET et CLR. Je mettrais tout en œuvre pour que votre demande soit correctement architecturée et organisée.Si la séparation du code en plusieurs assemblages est logique, cela réduit les efforts de maintenance, de déploiement et de refactoring, alors son BIEN vaut le faible coût supplémentaire pour la sécurité.

4

Ces contrôles de sécurité sont effectuées lorsque la CLR charge l'assemblage. Une fois l'assemblage chargé, aucune autre vérification de sécurité n'est nécessaire.

4

Je lis aussi le passage dans le livre de Bill Wagner et avait les mêmes doutes sur les performances, donc je benchmarkée l'application que nous développons actuellement:

Il y a quelques centaines de milliers à 3-4 millions d'appels une de nos classes C#

Cela ne fait aucune différence si cette classe est dans le même assembly ou dans un autre assembly tant qu'ils se trouvent sur la même machine dans le même processus et le même domaine. Je n'ai pas pu mesurer de pénalité de performance significative!

Bien sûr, si les appels doivent être marshalés, les choses sont différentes. Peut-être très différent ...