在intellisense中显示C#参考文档

时间:2018-08-17 09:59:09

标签: c# visual-studio unity3d

如果我创建一个列表列表。VisualStudio向其成员提供智能感知,但是没有有关成员的文档。如果转到列表的定义,则会看到以下内容:

[DefaultMember("Item")]
public class List<T> : IEnumerable, ICollection, IList, ICollection<T>, IEnumerable<T>, IList<T>
{
    // ...
    public void Add(T item);
    public void Clear();
    public bool Contains(T item);
    // ...
}

没有任何成员的评论/说明。这适用于任何其他核心类。

我该怎么做才能使Visual Studio 2017显示文档,这样我想知道方法的作用时就不必每次都Alt + Tab到官方C#参考文档网站?

是否需要添加任何SDK库才能获得文档?

我正在Unity项目上使用Visual Studio。

3 个答案:

答案 0 :(得分:3)

您可以执行此操作,但您必须了解两件事

1。Unity框架dll所在的位置

在编辑器中将“脚本运行时版本”设置为“ .NET 3.5等效”时,使用的C#DLL API位于:

<UnityInstallationDirecory>\Editor\Data\MonoBleedingEdge\lib\mono\unity

在编辑器中将“脚本运行时版本”设置为“ .NET 4.x等效”时,将使用最新框架,路径以框架版本结尾:

<UnityInstallationDirecory>\Editor\Data\MonoBleedingEdge\lib\mono\<API-version>

此路径将来可能会更改。要查找Unity正在使用的dll的当前路径,只需在“ Solution Explorer” 选项卡中展开Assembly and References。在Visual Studio中,然后选择C#DLL之一。在下面的示例中,选择了 System.dll ,路径将显示在属性下。

enter image description here



2。C#标准框架dll所在的位置

在Unity编辑器中使用“ .NET 3.5等效”时,使用的相应C#框架API位于:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client

在Unity编辑器中使用“ .NET 4.x等效”时,使用的相应C#框架API位于:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\<API-version>

在Visual Studio中显示C#核心文档

现在您知道位置了,请注意#2 标准框架位置中的每个dll都有一个以.xml扩展名结尾的免费xml文件。 。例如,System.Core.dll dll在同一文件夹中有名为System.Core.xml的互补文件。每个xml文件都包含每个相应dll文件的文档。

您要做的就是将每个xml文件的dll文件从标准框架位置复制到 Unity的框架dll 位置。重新启动Visual Studio,文档应该可以正常工作。

这是费时的手动操作,因此我制作了一个Editor插件来处理它。通过转到 Programmer -> 启用核心文档菜单启用它,并通过转到 Programmer -> Disable禁用它核心文档菜单。您必须重新启动Visual Studio才能使它生效。

enter image description here

using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class DocEnabler : MonoBehaviour
{
    //Replace both with the proper paths on your system
    static string unityFrameworkPath = @"G:\Applications\Unity\Editor\Data\MonoBleedingEdge\lib\mono\unity";
    static string stdCoreFrameworkPath = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client";

    [MenuItem("Programmer/Enable Core Documentation")]
    static void EnableCoreDoc()
    {
        CopyFilesByExt(stdCoreFrameworkPath, unityFrameworkPath, "xml");
    }

    [MenuItem("Programmer/Disable Core Documentation")]
    static void DisableCoreDoc()
    {
        DeleteFilesByExt(unityFrameworkPath, "xml");
    }

    static void DeleteFilesByExt(string path, string ext)
    {
        DirectoryInfo drctyInfo = new DirectoryInfo(path);
        FileInfo[] files = drctyInfo.GetFiles("*." + ext)
                             .Where(p => p.Extension == "." + ext).ToArray();

        foreach (FileInfo file in files)
        {
            try
            {
                file.Attributes = FileAttributes.Normal;
                file.Delete();
                //File.Delete(file.FullName);
            }
            catch (Exception e)
            {
                Debug.Log("Error while deleting file: " + file.Name + "\r\n" + e.Message);
            }
        }
        DoneMessage();
    }

    static void CopyFilesByExt(string source, string destPath, string ext)
    {
        DirectoryInfo drctyInfo = new DirectoryInfo(source);
        FileInfo[] files = drctyInfo.GetFiles("*." + ext)
                             .Where(p => p.Extension == "." + ext).ToArray();

        foreach (FileInfo file in files)
        {
            try
            {
                string fromPath = file.FullName;
                string toPath = Path.Combine(destPath, file.Name);

                file.CopyTo(toPath, true);
                //File.Copy(fromPath, toPath, true);
            }
            catch (Exception e)
            {
                Debug.Log("Error while Copying file: " + file.Name + "\r\n" + e.Message);
            }
        }
        DoneMessage();
    }

    static void DoneMessage()
    {
        Debug.Log("Action complete. Restart Visual Studio for the changes to take effect");
    }
}

答案 1 :(得分:2)

在 2021 年实现这一目标。程序员的解决方案仍然有效,但位置已更改,并且需要另一个副本来支持 netstandard 2.0。

我希望程序员不介意,但我使用更改的默认位置调整了脚本并添加了 netstandard 2.0 位置。 JetBrains Rider 也有同样的问题和解决方案。

我在该领域的经验是 2 天,因此请谨慎使用。但它解决了我所有的问题。

编辑:我发现不仅这些目录名称会因系统而异,而且 Windows 默认不附带 netstandard 参考。当我找到它的来源时,我会更正这篇文章。

using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;

public class DocEnabler : MonoBehaviour
{
  //Replace both with the proper paths on your system

  // .NET 4.x
  static string unityFrameworkPath = @"C:\Program Files\Unity\Hub\Editor\2021.1.5f1\Editor\Data\MonoBleedingEdge\lib\mono\4.7.1-api";
  static string microsoftFrameworkPath = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.X";

  // .NETSTANDARD 2.0
  static string unityNetStandardPath = @"C:\Program Files\Unity\Hub\Editor\2021.1.5f1\Editor\Data\NetStandard\ref\2.0.0";
  static string microsoftNetStandardPath = @"C:\Program Files\dotnet\packs\NETStandard.Library.Ref\2.1.0\ref\netstandard2.1";

  [MenuItem("Programmer/Enable Core Documentation")]
  static void EnableCoreDoc()
  {
    CopyFilesByExt(microsoftFrameworkPath, unityFrameworkPath, "xml");
    CopyFilesByExt(microsoftNetStandardPath, unityNetStandardPath, "xml");
  }

  [MenuItem("Programmer/Disable Core Documentation")]
  static void DisableCoreDoc()
  {
    DeleteFilesByExt(unityFrameworkPath, "xml");
    DeleteFilesByExt(unityNetStandardPath, "xml");
  }

  static void DeleteFilesByExt(string path, string ext)
  {
    DirectoryInfo dirInfo = new DirectoryInfo(path);
    FileInfo[] files = dirInfo.GetFiles("*." + ext)
      .Where(p => p.Extension == "." + ext).ToArray();

    foreach (FileInfo file in files)
    {
      try
      {
        file.Attributes = FileAttributes.Normal;
        file.Delete();
      }
      catch (Exception e)
      {
        Debug.Log("Error while deleting file: " + file.Name + "\r\n" + e.Message);
      }
    }
    DoneMessage();
  }

  static void CopyFilesByExt(string source, string destPath, string ext)
  {
    DirectoryInfo dirInfo = new DirectoryInfo(source);
    FileInfo[] files = dirInfo.GetFiles("*." + ext)
      .Where(p => p.Extension == "." + ext).ToArray();

    foreach (FileInfo file in files)
    {
      try
      {
        string toPath = Path.Combine(destPath, file.Name);
        file.CopyTo(toPath, true);
      }
      catch (Exception e)
      {
        Debug.Log("Error while Copying file: " + file.Name + "\r\n" + e.Message);
      }
    }
    DoneMessage();
  }

  static void DoneMessage()
  {
    Debug.Log("Action complete. Restart Visual Studio for the changes to take effect");
  }
}

我本想发表评论并附上一些证明图片,但我的业力还不够。

Here's a link 到它在 Visual Studio 中处理 .NET 2.0 项目的图像。

答案 2 :(得分:1)

我在Unity Answers网站Here中找到了答案。

  

Blue_Ninja0的回答·2017年9月21日,下午09:41

     

已经引起我注意,Unity不包含Intellisense文档中旧版Mono运行时所需的System.xml文件。

     

从Unity 2017开始,只要在播放器设置的API兼容性级别设置上启用.NET 4.6,您就会获得完整的文档。我已经测试过,并且效果很好。