You can try the RC release of Visual Studio 2010 Ultimate to generate dependency graphs for .NET code. You can generate a graph of all your assemblies, namespaces, classes, or some combination of these, or you can use Architecture Explorer to select specific artifacts and the relationships that you want to visualize.
You can also create layer diagrams from dependency graphs or from the existing artifacts, draw the permitted dependencies, and then include layer validation as part of the MSBuild process to make sure invalid dependencies aren't introduced:
How to: Generate Graph Documents from Code: http://msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource
You can use Visual Studio Ultimate to explore the relationships and organization in existing code by
generating directed graph documents. These graphs represent code elements and their relationships
as a set of nodes that are connected by links, or edges. You can use these graphs to help you
visualize, explore, and analyze code.
How to: Find Code Using Architecture Explorer: http://msdn.microsoft.com/en-us/library/dd409431%28VS.100%29.aspx
You can select vertical sections or "slices" of code that you want to visualize by using
Architecture Explorer. You can explore source code in a Visual Studio solution or
compiled managed code in .dll files or .exe files. You can use Architecture Explorer to browse
other domains by installing additional providers. When you find the code that you want to
visualize, you can generate graphs to explore the relationships in that code.
How to: Create Layer Diagrams from Artifacts: http://msdn.microsoft.com/en-us/library/dd465141%28VS.100%29.aspx
...use layer diagrams to visualize the high-level architecture of your system and to verify that
the code complies with this design. To perform this task, organize and associate the
artifacts from a Visual Studio solution into logical, abstract groups, or layers. These layers
describe major tasks that these artifacts perform or the major components of your system. Arrows
between the layers represent the interdependencies that exist or should exist between these
artifacts. To enforce architectural constraints on the code, describe the intended dependencies on
the diagram and then validate the code against the diagram. By using layer diagrams in this
manner, you can help make the code easier to understand, reuse, and maintain.
Layer Diagram http://i.msdn.microsoft.com/Dd465141.UML_LayerRefReading(en-us,VS.100).png
How to: Validate Code Against Layer Diagrams: http://msdn.microsoft.com/en-us/library/dd409395%28VS.100%29.aspx
Validating code against a layer diagram helps you enforce architectural constraints on the code
as it evolves. When you perform this task, dependencies in the code are compared with dependencies
on the diagram.
RC download: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a.
Visual Studio 2010 Architectural Discovery & Modeling Tools forum: http://social.msdn.microsoft.com/Forums/en-US/vsarch/threads