删除未使用的引用(!=“使用”)


Answers:


55

*注意:有关此答案的另一个版本,请参见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 Framework中的内容,因为它们通常不会被复制到生成输出中(通常-尽管对于Silverlight应用程序不一定是正确的)。

一些帖子似乎正在回答这个问题:“如何从源代码文件中删除使用子句(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#会重新发明该用法),但您还是先回答了这个问题。您介意将两者切换吗?
Boris Callens

会做。ReSharper的功能先于Visual Studio实施。它仍然可以通过其“自动更正”功能实现-当您拥有ReSharper时,智能标记将关闭。
jlo

1
现在约4年后的ReSharper 6.1直接获得了该功能!
朱利安·隆卡利亚

不确定您的意思-ReSharper拥有此功能已有多年。
2012年

8
注意:如果使用任何类型的反射从程序集动态加载,这将是一件坏事。您将使用“引用”将程序集随身带到bin /生产站点,但是没有直接引用它的代码。与护理一起使用!
卡斯珀·莱昂·尼尔森




4

ReSharper 6.1将包括以下功能:

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

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

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


4

ReSharper将为您做到这一点(还有更多!)


Resharper会实际删除对References文件夹中DLL的引用吗?我不认为这样做吗?
tobinharris

1
我不认为这会...我认为它只是对您未引用的名称空间使用using语句。FWIW-Coderush提供了相同的功能“还有更多!” :)

1
现在大约4年后的ReSharper 6.1才具有此功能!
朱利安·隆卡利亚

3

我在VS 2010 Ultimate Architecture-> Generate Dependency Graph-> By Assembly中完成了此操作,没有扩展,它显示了使用的程序集,并手动删除了未使用的引用。


对于较大的项目,我不建议这样做。我发现很难分辨出曾经使用过的和未使用过的。但是,我也碰巧是色盲的,因此很可能影响了它的用途。
DubiousPusher 2015年

2

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

您可以在项目dll上使用Telerik JustDecompile。只需在JustDecompile中打开dll,然后继续References查看已编译dll中实际使用的内容即可。

在此处输入图片说明


1
我认为这是一个很好的解决方案!你写VS插件吗?:) ILSpy有一个插件,我将看看它是否可以轻松地以某种方式半自动化...
Steven Coco

@StevenCoco我已经很长时间了,但是IDE api非常简单明了,在Internet上有很多很好的例子。祝您好运,如果您完成了我们的项目,请向我们更新!
toddmo '19

0

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

如果你有动力...


1
这并不总是正确的。例如,如果您有一个从Bar派生的Foo类,并且在Bar中有静态成员Blah,并将其称为Foo.Blah,则必须在编译器的引用中具有Foo的程序集,但不会发出它输入,因为静态成员在Bar中。还有更多类似的情况。
伊利亚·里珍科夫

是的,我已经注意到我脚本中的一些“漏洞”,却从未想出原因。谢谢(你的)信息。
杰尔

0

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


0

如果您知道未使用哪些参考,则可以手动将其删除。
在解决方案资源管理器中,右键单击“引用” 节点中的引用,然后单击“删除”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.