Get Project References From EnvDTE.Project

Suppose you’re developing a Visual Studio Extension and need to enumerate the references of a Visual Studio project. Here is how to do that:

public static IEnumerable<AssemblyName> CollectSettings(EnvDTE.Project project)
{
    var vsproject = project.Object as VSLangProj.VSProject;
    // note: you could also try casting to VsWebSite.VSWebSite

    foreach (VSLangProj.Reference reference in vsproject.References)
    {
        if (reference.SourceProject == null)
        {
            // This is an assembly reference
            var fullName = GetFullName(reference);
            var assemblyName = new AssemblyName(fullName);
            yield return assemblyName;
        }
        else
        {
            // This is a project reference
        }
    }
}

public static string GetFullName(VSLangProj.Reference reference)
{
    return string.Format("{0}, Version={1}.{2}.{3}.{4}, Culture={5}, PublicKeyToken={6}",
                            reference.Name,
                            reference.MajorVersion, reference.MinorVersion, reference.BuildNumber, reference.RevisionNumber,
                            reference.Culture.Or("neutral"),
                            reference.PublicKeyToken.Or("null"));
}

For the types in the namespace VSLangProj, you’ll need to reference VSLangProj.dll. EnvDTE.Project ist located in EnvDTE.dll. And just for completness, here’s the extension method used in the code above:

static class Extensions
{
    public static string Or(this string text, string alternative)
    {
        return string.IsNullOrWhiteSpace(text) ? alternative : text;
    }
}

Freelance full-stack .NET and JS developer and architect. Located near Cologne, Germany.

Leave a Reply

Your email address will not be published. Required fields are marked *