FIELD NOTE / 2026.09.123 MIN READ / 5 SOURCES

NuGet and the Arrival of First-Class Package Management for .NET

NuGet brought versioned packages, dependency metadata and restore directly into Visual Studio and later the .NET build system, replacing copied DLLs with reproducible package references.

.NET developers once distributed libraries through installers, source drops and copied DLLs

Before NuGet, adding a third-party .NET library could mean downloading an archive, copying assemblies into a project, updating references and manually tracking further dependencies. This workflow did not scale well as frameworks accumulated extensions and libraries.

NuGet emerged around Visual Studio 2010 to make reusable .NET libraries installable as versioned packages integrated directly into the development environment. NuGet 1.0 was released on January 13, 2011.[1]

A NuGet package combined binaries with dependency metadata

A .nupkg archive carries library assets and metadata describing identity, version and dependencies. The original .nuspec manifest told NuGet how to build a package and what other packages it required.[2]

This turned an assembly from an isolated DLL into a distribution unit that could participate in dependency resolution.

Installation could modify the project rather than only the filesystem

NuGet’s Visual Studio integration recorded package references in project metadata and added suitable assemblies to the project. Package management became part of project configuration rather than a separate download step.

Visual Studio integration made package discovery part of ordinary development

NuGet 1.x shipped as a Visual Studio extension with a package browser and Package Manager Console.[1]

That user experience mattered historically: developers could search, install and update libraries without leaving the IDE, giving .NET a package workflow comparable to fast-growing language ecosystems.

packages.config recorded a flattened installed set

Early NuGet projects used packages.config, an XML file listing package IDs and versions installed for a project.[3] Restore could read that file and fetch packages on another machine.

This reduced the pressure to commit package binaries into source control, though the flattened format carried limitations as solutions grew.

Restore separated dependency references from downloaded files

A project could commit metadata describing what it used while omitting the actual packages. Build machines could reconstruct dependencies from feeds, making package download a repeatable build step.

NuGet became a release vehicle for Microsoft’s own libraries

Microsoft’s .NET teams increasingly used NuGet to ship libraries outside the slower .NET Framework release cadence. A 2013 .NET team account describes NuGet as a way to release features faster, target multiple platforms and gather feedback.[4]

This changed the ecosystem’s status: package management was no longer only for third-party extensions; it became part of Microsoft’s own platform delivery strategy.

PackageReference moved dependencies into the project file

Modern NuGet favors PackageReference, which records top-level dependencies in the project file and computes the full dependency graph during restore.[5]

This replaced much of the packages.config model and integrated dependency resolution more tightly with MSBuild and the .NET SDK.

Transitive dependencies became explicit build graph inputs

With PackageReference, projects usually name direct dependencies and let restore calculate indirect dependencies. The resulting assets file gives the build a machine-readable graph rather than a flat checked-in list.

The NuGet feed model separated packages from one IDE

NuGet clients can consume package feeds outside Visual Studio, including through the dotnet CLI and build automation. Organizations can also operate private feeds alongside nuget.org.

This made the package format an ecosystem protocol rather than an IDE feature.

A common format supported both public and private distribution

The same package concepts could serve open-source libraries on nuget.org and internal organization feeds, helping standardize dependency workflows across development and enterprise deployment.

Why NuGet became first-class infrastructure for .NET

NuGet succeeded by meeting .NET developers where they already worked while gradually moving package identity and dependency graphs deeper into the build system. Its 1.0 Visual Studio integration lowered adoption friction; later restore and PackageReference models made dependencies more reproducible.[1][5]

The historical shift is visible in today’s .NET development: a library is expected to be published as a package with metadata and versions, and adding it is expected to be a project operation rather than manual file management.

RESEARCH / PROVENANCE

Works Cited

5 SOURCES
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05

CodeHistory is a living archive. Citations document the evidence used for this edition; later evidence may refine the account.

Contribute / Corrections

Improve the record.

Use this moderated submission form to suggest a correction, provide a source, challenge a priority claim or identify a missing contributor. Submissions are treated as research leads, not automatically published comments.

Submit a research lead

Please do not submit confidential material or claims you cannot support.