【问题标题】:Show C# reference documentation in intellisense在智能感知中显示 C# 参考文档
【发布时间】:2019-01-24 08:22:37
【问题描述】:

如果我创建一个列表列表。Visual Studio 为其成员提供智能感知,但没有针对成员的文档。如果我转到 List 的定义,我会看到以下内容:

[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);
    // ...
}

没有任何成员的 cmets/描述。这适用于任何其他核心类。

我可以做些什么来让 Visual Studio 2017 显示文档,这样当我想知道一个方法的作用时,我就不必 Alt+Tab 到官方 C# 参考文档网站了?

为了获得文档,我必须添加任何 SDK 库吗?

我在 Unity 项目中使用 Visual Studio。

【问题讨论】:

    标签: c# visual-studio unity3d


    【解决方案1】:

    你可以这样做,但你必须知道两件事

    1.Unity的framework dll所在位置

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

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

    当编辑器中的“Scripting Runtime Version”设置为“.NET 4.x Equivalent”时,使用最新的框架,路径以框架版本结尾:

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

    此路径将来可能会更改。要查找 Unity 正在使用的 dll 的当前路径,只需在 “解决方案资源管理器”选项卡中展开“程序集和引用”然后在 Visual Studio 中选择 C# DLL 之一。在下面的例子中,System.dll被选中,路径将显示在属性下。



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

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

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

    在 Unity 编辑器中使用“.NET 4.x Equivalent”时,使用的对应 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 文件的文档。

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

    手动操作很耗时,所以我制作了一个编辑器插件来处理它。通过转到 Programmer-->Enable Core Documentation 菜单启用它并通过转到 Programmer-->Disable 禁用它核心文档 菜单。您必须重新启动 Visual Studio 才能使其生效。

    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");
        }
    }
    

    【讨论】:

      【解决方案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 项目的图像。

      【讨论】:

        【解决方案3】:

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

        由 Blue_Ninja0 回答 · 2017 年 9 月 21 日晚上 9:41

        我注意到 Unity 不包含旧单声道运行时的 Intellisense 文档所需的 System.xml 文件。

        似乎从 Unity 2017 开始,只要您在 Player Settings 的 API Compatibility Level 设置中启用 .NET 4.6,您就会获得完整的文档。我已经测试过了,效果很好。

        【讨论】:

        • 感谢您的回答!我不得不坚持使用 3.5 版,所以我不得不选择另一个解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多