【问题标题】:Remove unused references (!= "using")删除未使用的引用(!=“使用”)
【发布时间】:2020-07-28 08:31:31
【问题描述】:

如何在我的项目中查找和删除未使用的引用?

我知道您可以轻松删除 vs 2008 中的 using 语句,但这不会删除您项目中的实际引用。引用的 dll 仍将复制到您的 bin/setup 包中。

【问题讨论】:

    标签: .net visual-studio reference


    【解决方案1】:

    *注意:有关此答案的另一个版本,请参阅 http://www.jetbrains.net/devnet/message/5244658

    通读帖子,似乎对原始问题有些困惑。让我试一试。

    原来的帖子实际上是在问一个问题:“如何识别和删除一个 Visual Studio 项目对其他未使用的项目/程序集的引用?”发帖人希望程序集不再作为构建输出的一部分出现。

    在这种情况下,ReSharper 可以帮助您识别它们,但您必须自己删除它们。

    为此,请在解决方案浏览器中打开引用,右键单击每个引用的程序集,然后选择“查找相关代码”。见:

    http://www.jetbrains.com/resharper/features/navigation_search.html#Find_ReferencedDependent_Code

    您将获得:

    1. 浏览器窗口中该引用的依赖项列表,或

    2. 一个对话框告诉您“未找到依赖于模块 XXXXXXX 的代码。”。

    如果你得到第二个结果,你可以右击引用,选择移除,然后从你的项目中移除它。

    虽然您必须“手动”执行此操作,即一次引用一个,但它会完成工作。如果有人以某种方式将其自动化,我有兴趣了解它是如何完成的。

    您几乎可以忽略 .Net 框架中的那些,因为它们通常不会被复制到您的构建输出中(通常 - 尽管对于 Silverlight 应用程序不一定如此)。

    一些帖子似乎在回答这个问题:“如何从源代码文件中删除不需要解析该文件中的任何引用的 using 子句 (C#)”。

    在这种情况下,ReSharper 在以下几个方面提供帮助:

    1. 在动态错误检测期间为您识别未使用的 using 子句。它们显示为代码检查警告 - 代码将在文件中显示为灰色(默认情况下),ReSharper 将提供删除它的提示:

      http://www.jetbrains.com/resharper/features/code_analysis.html#On-the-fly_Error_Detection

    2. 允许您在代码清理过程中自动删除它们:

      http://www.jetbrains.com/resharper/features/code_formatting.html#Optimizing_Namespace_Import_Directives

    最后,意识到 ReSharper 会对您的解决方案进行静态代码分析。因此,如果您有对程序集的动态引用(例如通过反射或在运行时动态加载并通过接口访问的程序集),它不会拾取它。没有什么可以替代理解您的代码处理项目时的基础和项目依赖项。我确实发现 ReSharper 功能非常有用。

    【讨论】:

    • 很好的广泛答案。奇怪的是,虽然你知道我指的不是 using 语句(清理是 VS 中的标准,但不明白为什么 R# 重新发明了它)你首先回答了这个问题。你介意把这两个调换一下吗?
    • 会的。 ReSharper 的功能先于 Visual Studio 实现。它仍然是通过它们的“自动更正”功能实现的 - 当您拥有 ReSharper 时,智能标签会关闭。
    • 现在大约 4 年后 ReSharper 6.1 直接获得了该功能!
    • 不确定您的意思 - ReSharper 多年来一直拥有此功能。
    • 注意:如果您使用任何类型的反射从程序集中动态加载,这将是一件坏事。您将使用“引用”将程序集带到垃圾箱/生产站点,但不会有直接引用它的代码。小心使用!
    【解决方案2】:

    你可以使用我写的 'Remove Unused References' 扩展:

    http://visualstudiogallery.msdn.microsoft.com/9811e528-cfa8-4fe7-9dd1-4021978b5097

    【讨论】:

    • 此扩展未发布
    • 我一开始就喜欢这个!但随后通过进一步测试,它删除了我需要的参考资料。关于失败的更多细节在这里:wpfsharp.com/2012/04/04/…
    【解决方案3】:

    删除未使用的引用是 Visual Studio 2008 已经支持的功能。不幸的是,仅适用于 VB .NET 项目。

    我已经在 Microsoft Connect 上提出了一项建议,以便也为 C# 项目获取此功能:

    http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=510326

    如果你也喜欢这个功能,那么你可以投票给我的建议。

    【讨论】:

      【解决方案4】:

      试试这个:Reference Assistant

      总结

      参考助手有助于从 C#、F#、 Visual Studio 2010 中的 VB.NET 或 VC++/CLI 项目。

      【讨论】:

      • 你知道 vs 2012 的类似扩展吗?
      • @isxaker 这现在是 resharper 的内置功能
      【解决方案5】:

      ReSharper 6.1 将包括以下功能:

      • 优化引用:分析您的程序集引用及其在代码中的用法,获取冗余引用列表并将其删除。

      • 删除未使用的引用:快速重构以删除多余的程序集引用。

      • 安全删除程序集引用:如果所有程序集引用都是冗余的,则将删除它们,否则会显示用法并且只能删除所选列表的冗余程序集引用。

      【讨论】:

        【解决方案6】:

        ReSharper 会为你做这件事(还有更多!)

        【讨论】:

        • Resharper 是否会真正删除 References 文件夹中对 DLL 的引用?我不认为它会这样做?
        • 我不认为它会......我认为它只是为您不引用的命名空间拉取 using 语句。 FWIW - Coderush 提供相同的功能“还有更多!” :)
        • 现在大约 4 年后 ReSharper 6.1 有了这个功能!
        【解决方案7】:

        我在 VS 2010 Ultimate 中没有扩展就做到了 Architecture->Generate Dependency Graph->通过Assembly显示使用的程序集,手动删除未使用的引用。

        【讨论】:

        • 我不建议将其用于较大的项目。我发现很难辨别什么是用过什么没用过。然而,我也碰巧是色盲,所以这可能影响了它对我的实用性。
        【解决方案8】:

        我有一个适用于任何版本的 Visual Studio 和任何框架版本的免费答案。它不会删除未使用的引用,但会识别它们。

        您可以在项目 dll 上使用 Telerik JustDecompile。只需在 JustDecompile 中打开 dll 并进入References 即可查看编译后的 dll 中实际使用了什么。

        【讨论】:

        • 我认为这是一个很好的解决方案!你写VS插件吗? :) ILSpy 有一个插件,我将看看它是否可以轻松地以某种方式实现半自动化......
        • @StevenCoco 我已经很久没有使用了,但是 IDE api 非常简单,网上有很多很好的例子。祝你好运,如果你完成了你的项目并更新我们!
        【解决方案9】:

        鉴于 VisualStudio(或者是 msbuild?)检测到未使用的引用并且不将它们包含在输出文件中,您可以编写一个脚本来解析 csproj 中的引用,并将其与通过检测到的引用程序集进行比较对项目输出的反思。

        如果你有动力...

        【讨论】:

        • 这并不总是正确的。例如,如果您有派生自 Bar 的类 Foo,并且在 Bar 中有静态成员 Blah,并且您将其称为 Foo.Blah,那么您必须在编译器的引用中包含 Foo 的程序集,但它不会被发出进入输出,因为静态成员在 Bar 中。这样的案例还有很多。
        • 是的,我注意到我的脚本中有一些“漏洞”,但一直没有弄清楚原因。感谢您的信息。
        【解决方案10】:

        我认为是在 bin\ 中复制的,因为在删除引用的项目中引用了具有相同引用的其他项目...

        【讨论】:

          【解决方案11】:

          如果您知道哪些引用未被使用,您可以手动删除它们。
          在解决方案资源管理器中,右键单击 References 节点中的引用,然后单击删除。

          【讨论】:

            猜你喜欢
            • 2010-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-11
            • 2019-01-20
            • 1970-01-01
            • 2016-06-27
            • 2016-03-22
            相关资源
            最近更新 更多