如何删除对 Dependencies/Frameworks/Microsoft.NETCore.App 中未使用程序集的引用?

Posted

技术标签:

【中文标题】如何删除对 Dependencies/Frameworks/Microsoft.NETCore.App 中未使用程序集的引用?【英文标题】:How to remove reference to unused assembly inside Dependencies/Frameworks/Microsoft.NETCore.App? 【发布时间】:2021-11-18 22:04:41 【问题描述】:

.NET 6 框架中有一些程序集,我 100% 肯定我永远不会使用它们,但是它们仍然出现在依赖项列表中,ReSharper(也可能是裸 VS)在导入类型时仍然会建议它们,而且总的来说它们的存在很烦人。

例如,我 100% 确定我永远不会使用 Microsoft.Win32.RegistrySystem.Drawing,但在编写 Color 时,我看到 IDE 建议我无法真正使用的类型。我正在放弃我的仅限 Windows 的方式,我不想再看到这些。

我在选择节点后尝试按Delete,没有任何反应。我尝试将<Reference Remove="System.Drawing" /> 添加到我的 .csproj 文件中,但没有任何反应。我尝试使用“删除未使用的引用”,没有任何反应。

问题:有没有办法摆脱这些引用?将它们从列表中删除是完美的,但将它们从 VS/R# 的建议中隐藏也可以。

我发现了多个关于删除 SO 上的引用的问题,但它们似乎都是关于 .NET 4.x,关于添加替代方案,所有这些对我的情况都没有用。

VS2022 17.0.1,R# 2021.3 EAP,.NET 6.0,最新的一切。

【问题讨论】:

你的TargetFramework是什么? @GuruStron <TargetFramework>net6.0</TargetFramework> 您需要创建自定义 SDK 定义。一种只导入您需要的东西。 ***.com/a/56178624/736079 @jessehouwing 这种方法有什么方向吗?我看到System.Drawing 只在Microsoft.NET.Sdk.WindowsDesktop.WindowsForms.propsMicrosoft.NET.Sdk.BeforeCommon.targets 中被提及,它们似乎都只适用于WinForms 和.NETFramework 案例。 Microsoft.Win32.Registry 仅在 Microsoft.NET.DefaultPackageConflictOverrides.targets 中提及,我假设它用于删除较新 .NET Core 版本的 NuGet 引用。如果一开始没有包含自定义 SDK,我该如何删除它? 【参考方案1】:

这些程序集称为MetaPackages,您无法删除它们。这是一个类似的问题,可能会对您有所帮助: How to remove extra reference from Microsoft.AspNetCore.All Meta package

【讨论】:

这似乎适用于较旧的 .NET Core 版本,其中所有这些包实际上以 NuGet 包的形式作为单独的实体存在,并被复制到我的编译文件旁边。我现在没有看到任何这种情况发生。【参考方案2】:

你不能在那里删除它,但是在你的项目构建之后,你可以用一些工具“treeshake”所有未使用的部分。大多数混淆器都有用于此目的的功能,我相信 ILMerge 也有一个开关来修剪未使用的类型(编辑:no it does not)。

请注意,如果您使用反射分配,则在删除没有静态引用但始终通过反射动态加载的类型时,您可能会遇到 TypeLoadException。使用这些类中的属性 [ObfuscationAttribute(Exclude=true)] 可能会有所帮助,但实际上该属性没有特定的属性来防止类被删除(只有属性本身)。特定的混淆器将有自己的选项或功能来防止修剪。

在 .Net 6 中,您可以使用 Visual Studio 将项目发布到文件夹,选择自包含,在文件发布选项中您将找到“生成单个文件”。这将尝试修剪任何未使用的(框架)程序集。它不会修剪使用过的程序集中未使用的类。

如果你想阻止不需要的选项出现在 Intellisense 中,我猜你不走运。您可以使用旧版本的 Visual Studio,它只会显示定义范围内可用的项目(在项目中以及您的 namespaceclassusing 列表中引用)。我个人认为较新的智能感知建议很有帮助,当我只记得类名时,它可以让我免于查找命名空间和程序集名称。

【讨论】:

以上是关于如何删除对 Dependencies/Frameworks/Microsoft.NETCore.App 中未使用程序集的引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除种子而不会对数据库产生任何影响?

给定一个未排序的数组,如何删除重复项然后对其进行排序?

如何在 Django 中使用引导模式对表数据进行删除确认?

C++中如何对vector删除元素

postgresql如何对序列进行创建修改以及删除

如何根据python中的多个条件对excel文件进​​行重复数据删除?