使用引用管理器添加或删除引用

可以使用“引用管理器”对话框添加和管理对你、Microsoft 或其他公司开发的组件的引用。 如果要开发通用 Windows 应用,你的项目将自动引用所有正确的 Windows SDK DLL。 创建 .NET 项目时,项目会自动引用它所需的组件,例如 .NET SDK,但在添加功能时需要添加引用。 一些 .NET API 在必须手动添加的组件中进行公开。 对 COM 组件或自定义组件的引用必须手动添加。

“引用管理器”对话框

“引用管理器”对话框在左侧显示不同类别,具体取决于项目类型:

添加引用

  1. 在“解决方案资源管理器”中,右键单击“引用”或“依赖项”节点,然后从上下文菜单中选择“添加项目引用”、“添加共享项目引用”或“添加 COM 引用”。 (也可以右键单击项目节点,从弹出的菜单中选择“添加”,然后从这些选项中进行选择。)

    Screenshot of the Add Reference dialog from the context menu in Solution Explorer.

    此时将打开“引用管理器”,并按组列出可用引用。

    Screenshot of the Reference Manager dialog box in Visual Studio.

  2. 选择要添加的引用,然后选择“确定”。

    注意

    如果未看到要查找的引用,请选择“浏览”以查找该引用。 (如果要开发 C++ 项目,则可能看不到浏览选项。)

“程序集”选项卡(仅限 .NET Framework)

注意

程序集”选项卡不适用于面向 .NET Core 或 .NET 5 及更高版本的项目,因为这些项目的程序集作为 NuGet 包添加,或者通过面向特定版本的 .NET 包含。 若要查看项目中引用的程序集,请展开项目中的“依赖项”节点,并在“框架”下查看。 在“依赖项”节点中,可以右键单击以添加或删除项目引用,或者打开 NuGet 包浏览器来管理 NuGet 包。 请参阅使用 NuGet 文档中的 NuGet 包管理器在 Visual Studio 中安装和管理包

对于 .NET Framework 项目,“程序集”选项卡列出了可用于引用的所有 .NET 程序集。 “程序集”选项卡不会列出全局程序集缓存 (GAC) 中的任何程序集,因为 GAC 中的程序集是运行时环境的一部分。 如果某个应用程序包含对在 GAC 中注册的程序集的引用,则在部署或复制该应用程序时,无论“复制本地”设置为何,所引用的程序集都不会与该应用程序一起部署或复制。 有关详细信息,请参阅管理项目中的引用

在手动添加对任何 EnvDTE 命名空间(EnvDTEEnvDTE80EnvDTE90EnvDTE90aEnvDTE100)的引用时,请在“属性”窗口中将引用的“嵌入互操作类型”属性设置为“False” 。 将此属性设置为“True”可能会导致生成问题,因为某些 EnvDTE 属性无法嵌入。

所有桌面项目都包含对 mscorlib 的隐式引用。 Visual Basic 项目包含对 Microsoft.VisualBasic 的隐式引用。 即使已将 System.Core 从引用列表删除,所有项目仍包含对其的隐式引用。

“程序集”选项卡包含两个子选项卡:

  1. “框架”列出组成目标框架的所有程序集。

    对于不面向 .NET Core 或通用 Windows 平台的项目,“框架”选项卡中枚举了目标框架中的程序集。 用户必须添加应用程序所需的任何引用。

    通用 Windows 项目默认包含对目标框架中所有程序集的引用。 在托管项目中,“解决方案资源管理器”的“引用”文件夹下的只读节点表示对整个框架的引用 。 因此,“框架”选项卡不枚举框架中的任何程序集,而是显示以下消息:“已引用所有框架程序集。 请使用对象浏览器浏览框架中的引用”。

  2. “扩展”列出了组件和控件的外部供应商为扩展目标框架而开发的所有程序集。 根据用户应用程序的用途,可能需要这些程序集。

    “扩展”通过枚举在以下位置注册的程序集来填充:

    32 位计算机:

    • HKEY_CURRENT_USER\SOFTWARE\Microsoft\[Target Framework Identifier]\v[Target Framework Version]\AssemblyFoldersEx\[UserComponentName]\@default=[Disk location of assemblies]
    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\[Target Framework Identifier]\v[Target Framework Version]\AssemblyFoldersEx\[UserComponentName]\@default=[Disk location of assemblies]

    64 位计算机:

    • HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\[Target Framework Identifier]\v[Target Framework Version]\AssemblyFoldersEx\[UserComponentName]\@default=[Disk location of assemblies]
    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\[Target Framework Identifier]\v[Target Framework Version]\AssemblyFoldersEx\[UserComponentName]\@default=[Disk location of assemblies]

    [目标框架标识符]的旧版本

    例如,如果项目以 32 位计算机上的 .NET Framework 4 为目标,则“扩展”将枚举在 \Microsoft.NETFramework\v4.0\AssemblyFoldersEx、\Microsoft.NETFramework\v3.5\AssemblyFoldersEx、\Microsoft.NETFramework\v3.0\AssemblyFoldersEx 和 \Microsoft.NETFramework\v2.0\AssemblyFoldersEx 下注册的程序集。

列表中的某些组件可能不会显示,具体取决于项目的框架版本。 在下列条件下,可能会出现这种情况:

  • 使用最新框架版本的组件与面向早期版本的项目不兼容。

    有关如何更改项目的目标框架版本的信息,请参阅框架目标概述

  • 使用旧版的 .NET Framework 的组件与以较新的 .NET Framework 为目标的项目不兼容。

有关 .NET Framework 版本之间的版本兼容性的详细信息,请参阅版本兼容性

应当避免添加对同一解决方案中另一个项目的输出的文件引用,因为这样做可能导致编译错误。 而应使用“添加引用”对话框的“项目”选项卡来创建项目到项目的引用。 这种做法可以更好地管理在项目中创建的类库,从而更易于进行团队开发。 有关详细信息,请参阅有关无效引用的疑难解答

注意

如果一个项目的目标框架版本为 .NET Framework 4.5 或更高版本,而另一个项目的目标版本为 .NET Framework 2、3、3.5 或 4.0,则将创建文件引用而不是项目引用。 有关 .NET、.NET Framework 和 .NET Core 的详细信息,请参阅什么是 .NET(和 .NET Core)

在“添加引用”对话框中显示程序集

  • 将程序集移动或复制到下列位置之一:

    • 当前项目目录。 (可以使用 “浏览” 选项卡查找这些程序集。)

    • 同一解决方案中的其他项目目录。 (可以使用“项目”选项卡查找这些程序集。)

    - 或 -

  • 设置指定要显示的程序集位置的注册表项:

    对于 32 位操作系统,添加以下注册表项之一。

    • [HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework\<VersionMinimum>\AssemblyFoldersEx\MyAssemblies]@="<AssemblyLocation>"

    • [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\<VersionMinimum>\AssemblyFoldersEx\MyAssemblies]@="<AssemblyLocation>"

    对于 64 位操作系统,在 32 位注册表配置单元中添加以下注册表项之一。

    • [HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\<VersionMinimum>\AssemblyFoldersEx\MyAssemblies]@="<AssemblyLocation>"

    • [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\<VersionMinimum>\AssemblyFoldersEx\MyAssemblies]@="<AssemblyLocation>"

    <VersionMinimum> 是所应用的最低框架版本。 如果 <VersionMinimum> 为 v3.0,则 AssemblyFoldersEx 中指定的文件夹应用于以 3.0 版本及更高版本的 .NET Framework 为目标的项目。

    <AssemblyLocation> 是要在“添加引用”对话框中显示的程序集目录,例如 C:\MyAssemblies。

    通过在 HKEY_LOCAL_MACHINE 节点下创建注册表项,所有用户都可以在“添加引用”对话框中的指定位置看到这些程序集。 在 HKEY_CURRENT_USER 节点下创建注册表项只会影响当前用户的设置。

    再次打开“添加引用”对话框。 程序集应出现在“.NET”选项卡中。如果未显示,请确保这些程序集位于指定的 AssemblyLocation 目录中,然后重启 Visual Studio 并重试。

“项目”选项卡

在“解决方案”子选项卡中,“项目”选项卡列出当前解决方案中的所有兼容项目。

一个项目可以引用面向其他框架版本的另一个项目。 例如,可以创建一个以 .NET 8.0 为目标、但引用针对 .NET 6.0 生成的程序集的项目。 但是,.NET 6.0 项目不能引用 .NET Framework 8.0 项目。 有关详细信息,请参阅框架定位概述

“共享项目”选项卡

在“引用管理器”对话框的“共享项目”选项卡上添加对共享项目的引用。 使用共享项目,可以编写由许多不同的应用程序项目引用的通用代码。

通用 Windows 选项卡

“通用 Windows”选项卡列出特定于运行 Windows 操作系统的平台的所有 SDK。 此选项卡具有两个子组:“核心”与“扩展” 。

“核心”子组

默认情况下,通用 Windows 应用项目具有对通用 Windows SDK 的引用。 因此,“引用管理器”中的“核心”子组不枚举通用 Windows SDK 的任何程序集 。

“扩展”子组

“扩展”列出用于扩展目标 Windows 平台的用户 SDK。

SDK 是文件集合,Visual Studio 将其视为单个组件。 在“扩展”选项卡中,应用于调用了“引用管理器”对话框的项目的 SDK 将作为单个项列出。 添加到项目时,所有 SDK 内容将由 Visual Studio 使用,这样,用户无需采取任何额外操作即可使用 IntelliSense、工具箱、设计器、对象浏览器、生成、部署、调试和打包中的 SDK 内容。

若要了解如何在“扩展”选项卡中显示 SDK,请参阅创建软件开发工具包

注意

如果项目引用的 SDK 依赖于另一 SDK,则只有在用户手动添加对另一 SDK 的引用后,Visual Studio 才会使用另一 SDK。 在“扩展”选项卡上选择 SDK 时,“引用管理器”对话框会在详细信息窗格中列出所有依赖项,从而帮助你找出 SDK 依赖项

如果项目类型不支持扩展,则此选项卡不会显示在“引用管理器”对话框中。

“COM”选项卡

“COM”选项卡列出可供引用的所有 COM 组件。 如果要添加对包含内部清单的已注册 COM DLL 的引用,请先注销该 DLL。 否则,Visual Studio 会将程序集引用作为 ActiveX 控件而不是本机 DLL 添加。

如果项目类型不支持 COM,则此选项卡不会显示在“引用管理器”对话框中。

浏览

可以使用“浏览”按钮浏览查找文件系统中的组件。

一个项目可以引用面向其他框架版本的组件。 例如,可以创建一个面向 .NET Framework 4.7.2、但引用面向 .NET Framework 4 的组件的应用程序。 有关详细信息,请参阅框架定位概述

避免在同一个解决方案中添加对另一个项目的输出的文件引用,因为这可能导致编译错误。 而应使用“引用管理器”对话框的“解决方案”选项卡来创建项目到项目的引用。 这样就可以更好地管理在项目中创建的类库,从而更易于进行团队开发。 有关详细信息,请参阅有关无效引用的疑难解答

无法浏览到 SDK 并将其添加到项目。 只能浏览到文件(例如程序集或 .winmd)并将其添加到项目。

执行对 WinMD 的文件引用时,预期布局为 <FileName>.winmd、<FileName>.dll 和 <FileName>.pri 文件全部并排放置。 如果在以下情况下引用 WinMD,一组不完整的文件将复制到项目输出目录中,从而导致生成和运行时失败。

  • 本机组件:本机项目将为每个不相交的命名空间集创建一个 WinMD 以及一个包含实现的 DLL。 WinMD 具有不同的名称。 引用此本机组件文件时,MSBuild 不会将名称不同的 WinMD 视为一个组件。 因此,仅复制 <FileName>.dll<FileName>.winmd,并且会发生运行时错误。 若要解决此问题,请创建扩展 SDK。 有关详细信息,请参阅创建软件开发工具包

  • 使用控件:XAML 控件至少包含一个 <FileName>.winmd、一个 <FileName>.dll、一个 <FileName>.pri、一个 <XamlName>.xaml 和一个 <ImageName>.jpg。 生成项目后,与文件引用关联的资源文件不会复制到项目的输出目录中,仅复制 <fileName>.winmd<FileName>.dll<FileName>.pri。 记录生成错误,指示缺少 <XamlName>.xaml<ImageName>.jpg 的资源。 若要成功,请将这些资源文件手动复制到项目输出目录以用于生成和调试/运行时。 若要解决此问题,请按照创建软件开发工具包中的步骤创建扩展 SDK,或编辑项目文件,添加以下属性:

    <PropertyGroup>
       <GenerateLibraryOutput>True</GenerateLibraryOutput>
    </PropertyGroup>
    

    注意

    如果添加属性,生成可能会运行较慢。

Recent

“程序集”、“COM”、“Windows”和“浏览”均支持“最近”选项卡,此选项卡可枚举最近添加到项目的组件的列表 。

“引用管理器”对话框中的搜索栏在具有焦点的选项卡上运行。 例如,在“解决方案”选项卡处于焦点时,如果在搜索栏中键入“System”,则除非解决方案具有包含“System”的项目名称,否则搜索不会返回任何结果

删除引用

可以使用“删除未使用的引用”菜单项在 Visual Studio 中删除 SDK 样式项目未使用的引用。

Screenshot of the Remove Unused Reference dialog from the context menu in Solution Explorer.

有关详细信息,请参阅删除未使用的引用