110 votes

Comment Microsoft a-t-il créé les assemblys qui ont des références circulaires ?

Dans l' .NET BCL il y a des références circulaires entre:

  • System.dll et System.Xml.dll
  • System.dll et System.Configuration.dll
  • System.Xml.dll et System.Configuration.dll

Voici une capture d'écran .NET Réflecteur, qui montre ce que je veux dire:

circulardependencies.png

Comment Microsoft a créé ces assemblées est un mystère pour moi. Est une compilation spéciale de processus nécessaires pour permettre cela? J'imagine quelque chose d'intéressant qui se passe ici.

59voto

Dykam Points 5343

Je peux seulement dire comment le Projet Mono. Le théorème est assez simple, mais il donne un code de mess.

Ils ont d'abord compiler System.Configuration.dll sans la partie ayant besoin de la référence à System.Xml.dll. Après cela, ils compiler System.Xml.dll la façon normale. Maintenant vient la magie. Ils recompiler System.configuration.dll avec la partie ayant besoin de la référence à System.Xml.dll. Maintenant, il y a une compilation réussie avec la circulaire de référence.

En bref:

  • Un est compilé sans le code besoin de B et la référence à B.
  • B est compilé.
  • Un est recompilé.

36voto

Srdjan Jovcic Points 659

RBarryYoung et djleop sont sur quelque chose. Microsoft utilise un outil interne qui utilise ILDASM pour démonter les assemblys, bande interne/privé tous les trucs et méthode corps et recompiler IL à nouveau (à l’aide de ILASM) dans ce qu’on appelle « Assemblée déshydratée » ou assembly de métadonnées. Cela se fait chaque fois l’interface publique de l’assembly est modifié.

Au cours de la construction, ensembles de métadonnées sont utilisés au lieu de vrais. Ce cycle moyen est cassé.

27voto

Alfred Myers Points 4665

Il peut être fait à la façon djleop décrit, mais Visual Studio vous empêche de le faire.

Vous devrez utiliser le compilateur de ligne de commande csc.exe directement.

  1. csc/target : Library ClassA.cs
  2. csc/target : Library ClassB.cs /reference:ClassA.dll
  3. csc/target : Library ClassA.cs ClassC.cs /reference:ClassB.dll

19voto

JohannesH Points 3817

Son assez facile à faire dans Visual Studio, tant que vous n'utilisez pas les références de projet... Essayez ceci:

  1. Ouvrez visual studio
  2. Créer 2 projets de Bibliothèque de Classe "ClassLibrary1" & "ClassLibrary2".
  3. Construire
  4. De ClassLibrary1 ajouter une référence à ClassLibrary2 par la navigation à la dll créé à l'étape 3.
  5. De ClassLibrary2 ajouter une référence à ClassLibrary1 par la navigation à la dll créé à l'étape 3.
  6. Construire à nouveau (Note: si vous apportez des modifications dans les deux projets qui vous serait nécessaire de construire deux fois pour faire à la fois des références "frais")

Donc, c'est comment vous le faites. Mais sérieusement... N'avez-vous JAMAIS faire à un vrai projet! Si vous le faites, Santa habitude de vous apporter les cadeaux de cette année.

6voto

Steve Gilham Points 7829

Je suppose que cela pourrait se faire en commençant par un jeu acyclique d’assemblys et utilisant ILMerge pour ensuite fusionner les petites assemblées en groupes logiquement associés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X