簡體   English   中英

在智能感知中顯示 C# 參考文檔

[英]Show C# reference documentation in intellisense

如果我創建一個列表列表.. 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);
    // ...
}

沒有任何成員的評論/描述。 這適用於任何其他核心類。

我該怎么做才能讓 Visual Studio 2017 顯示文檔,這樣我就不必在任何時候想知道某個方法的作用時按 Alt+Tab 到官方 C# 參考文檔網站?

是否需要添加任何 SDK 庫才能獲得文檔?

我在 Unity 項目上使用 Visual Studio。

你可以這樣做,但你必須知道兩件事

1.Unity的框架dll所在位置

當“腳本運行時版本”在​​編輯器中設置為“.NET 3.5 Equivalent”時,使用的 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 Editor 中使用“.NET 3.5 Equivalent”時,使用的相應 C# 框架 API 位於:

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

在 Unity Editor 中使用“.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 Core Documentation菜單禁用它。 您必須重新啟動 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");
    }
}

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

我會作為評論發布並包含一些證明圖片,但我還沒有足夠的業力。

是它在 Visual Studio 中處理.NET 2.0項目的圖像的鏈接

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

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

我注意到 Unity 不包括其舊單聲道運行時的 Intellisense 文檔所需的 System.xml 文件。

似乎從 Unity 2017 開始,只要您在 Player Settings 的 API Compatibility Level 設置中啟用 .NET 4.6,您就會獲得完整的文檔。 我已經測試過了,效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM