如果我创建一个列表列表。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。
答案 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 ,路径将显示在属性下。
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才能使它生效。
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,您就会获得完整的文档。我已经测试过,并且效果很好。