bwe*_*rks 3 resharper powershell automation assembly-references
我正在使用一个包含大量项目的大型代码库,每个项目都有少量(在某些情况下,巨大的)引用其他项目.随着时间的推移,在这个代码库上已经进行了大量的重构,因此有些项目被一些项目引用只是因为它们曾经包含一个已移到别处的类; 诸如此类的事情.
ReSharper有一个集成到IDE中的工具,允许用户查找实际使用给定项目的给定引用的代码,但是为了将其转换为解决方案,我们需要让人员右键单击每个项目中的每个引用然后实际检查没有使用然后删除它们,这不仅是一个漫长的过程,而且还与酷刑接壤.
我希望能够自动执行此过程,以便我们只运行它并删除不必要的引用; 然后我们可以将它整合到某种常规过程中,以便捕获被忽视的错误.
我想到的两个选项是A)如果可能的话,使用Powershell自动化ReSharper,或者B)也许Visual Studio 2010架构依赖关系图可以处理这个问题,如果我很幸运的话,也许可以用脚本方式处理.
我的问题是这些:
你应该能够用简单的powershell做到这一点:
1)使用您的解决方案加载visual studio
2)编译整个解决方案
3)离开VS运行并启动powershell.exe
4)从ROT中获取对仍在运行的VS DTE实例的引用(重要 - 确保只运行一个实例 - 如果它的提升,powershell也应该如此):
ps> $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("visualstudio.dte")
Run Code Online (Sandbox Code Playgroud)
5)通过枚举解决方案中的所有项目及其引用进行测试:
ps> $dte.solution.projects | select @{l="name";e={$_.name}}, `
@{l="references";e={$_.object.references|select -exp name}} | ft -auto
Run Code Online (Sandbox Code Playgroud)
...转储所有项目名称和引用...
6)现在,编写一些脚本来遍历解决方案文件夹和项目
7)当您点击bin \文件夹时,只加载反射加载程序集:
$assembly = [reflection.assembly]::reflectiononlyload($dll)
Run Code Online (Sandbox Code Playgroud)
8)获取输出程序集中的实际引用程序集
$refs = $assembly.getreferencedassemblies()
Run Code Online (Sandbox Code Playgroud)
9)将实际引用的程序集与项目中引用的程序集进行比较,并通过VS DTE对象模型删除冗余的程序集
# example
$currentproj.object.references.item("system.core").remove()
$currentproj.save()
Run Code Online (Sandbox Code Playgroud)
10)利润!
这是有效的,因为.net只链接代码中实际引用的程序集.对不起,我无法发布一个完整的工作示例,但这应该足以让您入门.
-Oisin
归档时间: |
|
查看次数: |
1531 次 |
最近记录: |