gpt4 book ai didi

powershell - C# : Automated removal of unnecessary assembly references?

转载 作者:行者123 更新时间:2023-12-01 09:37:44 25 4
gpt4 key购买 nike

我正在处理包含大量项目的大型代码库,每个项目都有少数(在某些情况下,大量)对其他项目的引用。随着时间的推移,对这个代码库进行了大量的重构,结果有许多程序集被某些项目引用,只是因为它们曾经包含一个已经转移到其他地方的类;那种东西。

ReSharper 有一个集成到 IDE 中的工具,允许用户查找实际使用给定项目的给定引用的代码,但是为了将其转化为解决方案,我们需要让一个人右键单击每个引用在每个项目中,然后实际检查没有使用然后删除它们,这不仅是一个漫长的过程,而且接近于折磨。

我希望能够自动执行此过程,以便我们只运行它并删除不必要的引用;然后,我们或许可以将其整合到某种常规流程中,以便发现被忽略的错误。

我想到的两个选项是 A) 如果可能的话,使用 Powershell 自动化 ReSharper,或者 B) 也许 Visual Studio 2010 架构依赖关系图可以处理这个问题,如果幸运的话,也许可以以可编写脚本的方式处理。

我的问题是:

  • 可以为 ReSharper 编写这样的脚本吗?
  • VS2010 架构是否提供以任何类型的批处理/自动方式删除未使用的引用?

最佳答案

你应该可以用简单的 powershell 来做到这一点:

1) 使用您的解决方案加载 Visual Studio

2) 编译整个解决方案

3) 让VS运行并启动powershell.exe

4) 从 ROT 中获取对仍在运行的 VS 的 DTE 实例的引用(重要 - 确保只有一个实例在运行 - 如果它被提升,powershell 也应该是):

ps> $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("visualstudio.dte")

5) 通过枚举解决方案中的所有项目及其引用进行测试:

ps> $dte.solution.projects | select @{l="name";e={$_.name}}, `
@{l="references";e={$_.object.references|select -exp name}} | ft -auto

...转储所有项目名称和引用...

6) 现在,编写一些脚本来遍历解决方案文件夹和项目

7) 当您点击 bin\文件夹时,加载仅反射加载的程序集:

$assembly = [reflection.assembly]::reflectiononlyload($dll)

8) 在输出程序集中获取实际引用的程序集

$refs = $assembly.getreferencedassemblies()

9)将实际引用的程序集与项目中引用的程序集进行比较,并通过VS DTE对象模型删除冗余的程序集

# example
$currentproj.object.references.item("system.core").remove()
$currentproj.save()

10) 利润!

这是因为 .net 只链接代码中实际引用的程序集。抱歉,我无法发布完整的工作示例,但这应该足以让您入门。

-奥辛

关于powershell - C# : Automated removal of unnecessary assembly references?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4831815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com