Dalam ekstensi Visual Studio saya perlu mengulangi semua proyek dalam solusi yang dimuat dan menemukan semua Ketergantungan (baik paket NuGet maupun rakitan). Kode berikut berfungsi dengan baik untuk proyek gaya non-SDK lama tetapi tidak untuk proyek gaya SDK baru.

var dte = ApplicationObject; // DTE object
if (dte == null || dte.Solution == null || !dte.Solution.IsOpen)
{
    return;
}

foreach (Project project in dte.Solution.Projects)
{
    var vsProj = project.Object as VSProject;
    if (vsProj == null || vsProj.References == null)
    {
        // Project not loaded
        continue;
    }

    foreach (Reference reference in vsProj.References)
    {
        if (reference.SourceProject != null 
            || reference.Type != prjReferenceType.prjReferenceTypeAssembly)
        {
            // Skip over non assembly references
            continue;
        }

        // reference.Name contains the reference name
    }
}

Dalam proyek bergaya SDK baru, "referensi" sekarang disebut Dependensi tetapi tidak ada properti seperti itu di VSProject. Jadi apa cara untuk mendapatkan ini untuk proyek bergaya SDK?

-1
Santosh 20 September 2019, 22:01

2 jawaban

Jawaban Terbaik

Jadi apa cara untuk mendapatkan ini untuk proyek bergaya SDK?

Saya khawatir jawabannya negatif. Ini bisa menjadi salah satu masalah yang terkait dengan VS2019 SDK dan sistem proyek SDK baru.

Dan masalah ini terjadi secara khusus di IVsSolutionEvents.OnAfterOpenSolutionevent. Saya mencoba memanggil kode serupa di acara OnQueryCloseSolution atau dalam acara klik Command Item tetapi semuanya berfungsi dengan baik untuk solusi yang sama dengan aplikasi one .net core di dalamnya.

Saya pikir itu bisa menjadi salah satu masalah karena solusi dan proyek tidak nol (saya menampilkan xx.sln dan xx.csproj), tetapi tidak bisa mendapatkan reference.Name dari vsProj.References. Dan itu berfungsi saat menutup solusi, tetapi dapatkan daftar kosong saat membuka solusi. Untuk saat ini, saya tidak menemukan solusi yang valid yang membuatnya berfungsi.

Masalah dilaporkan ke DC, jika ada yang tertarik, Anda dapat melacak masalah di sini.

1
Lance Li-MSFT 27 September 2019, 10:12

Proyek VS2019 adalah proyek perpustakaan .net core 3.1 dan kode berikut saat solusinya terbuka. sebenarnya mengambil lokasi jalur referensi yang disimpan di lokasi nuget:

C:\Users\xxxxx\.nuget\packages\subsonic.core.dal\4.2.1\lib\netstandard2.1\SubSonic.Core.DataAccessLayer.dll

public string ResolveAssemblyReference(string assemblyReference)
{
    ThreadHelper.ThrowIfNotOnUIThread();

    string path = EngineHost.ResolveAssemblyReference(assemblyReference);

    if (path.Equals(assemblyReference, StringComparison.Ordinal) &&
        !foundAssembly.IsMatch(path))
    {   // failed to find the assembly, could it be referenced via a project reference?
        if (GetService(typeof(DTE)) is DTE dTE)
        {
            foreach (Project project in dTE.Solution.Projects)
            {
                if (project.Object is VSProject vsProject)
                {
                    path = ResolveAssemblyReferenceByProject(assemblyReference, vsProject.References);
                }
                else if (project.Object is VsWebSite.VSWebSite vsWebSite)
                {
                    path = ResolveAssemblyReferenceByProject(assemblyReference, vsWebSite.References);
                }
            }
        }

        if (!foundAssembly.IsMatch(path))
        {
            LogError(false, SubSonicCoreErrors.FileNotFound, -1, -1, $"{assemblyReference}.dll");
        }
    }

    return path;
}

private string ResolveAssemblyReferenceByProject(string assemblyReference, References references)
{
    foreach (Reference reference in references)
    {
        if (reference.Name.Equals(assemblyReference, StringComparison.OrdinalIgnoreCase))
        {   // found the reference
            return reference.Path;
        }
    }

    return assemblyReference;
}

private string ResolveAssemblyReferenceByProject(string assemblyReference, VsWebSite.AssemblyReferences references)
{
    foreach (VsWebSite.AssemblyReference reference in references)
    {
        if (reference.Name.Equals(assemblyReference, StringComparison.OrdinalIgnoreCase))
        {   // found the reference
            return reference.FullPath;
        }
    }

    return assemblyReference;
}
0
Matt Ke 27 Juli 2020, 21:35