【问题标题】:Find dependencies of SDK-style projects查找 SDK 风格项目的依赖项
【发布时间】:2019-09-20 19:01:11
【问题描述】:

在 Visual Studio 扩展中,我需要遍历加载的解决方案中的所有项目并找到所有依赖项(NuGet 包和程序集)。以下代码适用于旧的非 SDK 样式项目,但不适用于新的 SDK 样式项目。

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
    }
}

在新的 SDK 样式项目中,“引用”现在称为 Dependencies,但 VSProject 上没有此类属性。那么对于 SDK 风格的项目,有什么方法可以得到这个呢?

【问题讨论】:

  • 嗨,我在 VS2017 和 VS2019 中尝试过,上面的代码可以识别 .net core 或 .net 标准项目中的 nuget 包和引用。
  • 这个问题有什么更新吗?您能否分享更多详细信息(相对于版本、项目类型、框架、您得到的错误行为)以帮助重现您遇到的问题 :)
  • @LanceLi-MSFT 很抱歉没有早点回来。使用上面的代码,当它在新的 SDK 样式项目(针对 .netcoreapp2.1)上运行时,我在 vsProj.References 中得到一个空列表。我正在使用 VS2019。请注意,上面的代码在事件IVsSolutionEvents.OnAfterOpenSolution 中被调用。

标签: visual-studio-extensions vsix


【解决方案1】:

那么对于 SDK 风格的项目,如何获得这个?

恐怕答案是否定的。这可能是与 VS2019 SDK 和新的 SDK 项目系统相关的一个问题。

这个问题特别发生在IVsSolutionEvents.OnAfterOpenSolutionevent。我试图在OnQueryCloseSolution 事件或Command Item 的点击事件中调用类似的代码,但对于包含one .net core 应用程序的相同解决方案,这一切都很好。

我认为这可能是一个问题,因为解决方案和项目不为空(我输出 xx.sln 和 xx.csproj),但它无法从 vsProj.References 获得 reference.Name。它在关闭解决方案时有效,但在打开解决方案时得到空列表。目前,我发现没有有效的解决方法可以使它工作。

问题已报告给DC,如果有人对此感兴趣,您可以跟踪问题here

【讨论】:

  • 感谢您确认它不起作用并报告问题。我想在这一点上没有比这更好的答案了,所以我会接受这个作为答案。
  • @Santosh 谢谢,您可以通过DC中的链接跟踪问题,不便之处敬请见谅:)
【解决方案2】:

VS2019 项目是一个 .net core 3.1 库项目和以下代码,同时解决方案处于打开状态。实际上是检索存储在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多