目录
在这篇文章中,您将学习如何识别VS project resources.resx文件中已使用和未使用的资源。
如果您经常在Visual Studio项目中使用项目资源,无论是VB还是C#,最终都会得到一个包含许多未使用项的大资源文件(例如,Resources)。这是因为,当您删除使用资源的代码时,您经常会忘记删除实际的资源项。
此问题有一些解决方案,例如使用商业代码重构工具或对Resources.Designer.vb/Resources.Designer.cs 进行一些小的修改,并依靠编译器生成有关未使用资源的警告。在这篇文章中,我选择采用不同的方法:使用批处理脚本。
我的完整批处理脚本将接受命令行中的四个参数,从左到右列出:
- VB.NET源代码文件的路径,例如WindowsApplication1*.vb
- 项目资源文件的名称,例如WindowsApplication1My ProjectResources.resx
- 写入所有资源使用情况的文件的名称,例如all_resources.txt
- 写入所有未使用资源的文件的名称,例如unused_resources.txt
它利用FOR扩展语法(FOR /F)来解析资源文件并且FINDSTR查找引用所有资源的位置。它只能与VB源代码文件一起使用,其中大多数开发人员经常使用 My.Resources.XXXX 来访问资源。由于FINDSTR只是执行string搜索,批处理脚本不会关心被注释掉的代码,以及不使用VB的My命名空间访问的资源。如果要将其与C#源代码一起使用,则需要编辑调用FINDSTR以匹配访问资源的方法,例如,是Project1.Resources.Resource1而不是My.Resources.Resource1。
这篇文章的其余部分将分析我在写这篇文章时遇到的一些有趣的观点——希望这对那些有类似问题的人有用。
批处理脚本——尽管很粗糙,但功能强大
许多人可能认为批处理脚本已成为过去,因为今天有很多替代方案——Windows PowerShell、Perl或.VBS 文件。然而,有时,我仍然使用它,因为它强大而简单。查看用于搜索资源的代码:
FOR /F "tokens=*" %%a IN (%TMPFILE%) DO (
………
FINDSTR /S /P /N /C:"My.Resources.%%c" %SRCPATH% >> %OUT_ALLTOKENS%
REM FindStr returns an errorlevel of 0 if the string was found,
1 and above if it was not found.
IF ERRORLEVEL 1 (
………
)
………….
)
)
对FOR /F和FINDSTR的调用可以很容易地转换为10-20行.NET代码,除非使用某些现有的文本处理库。在这里,几乎所有事情都完成了,只需记住语法,可通过FOR /?或FINDSTR /?。
另一个例子是如何生成一个随机的文件名:
:GETTEMPNAME
set TMPFILE=%TMP%mytempfile-%RANDOM%-%TIME:~6,5%.tmp
if exist "%TMPFILE%" GOTO :GETTEMPNAME
等效的.NET代码为:
string filename = Path.GetTempFileName()
但是,批处理脚本仍然非常粗糙。例如,尽管Windows XP批处理脚本允许通过(........)使用block语句,但不要指望一切都能像在现代编程语言中那样工作。以下情况将导致问题:
IF (%1) == () (
ECHO Missing first parameter: path to the VB.NET source code files
(e.g. WindowsApplication1*.vb)
EXIT /B 1
) ELSE (
SET SRCPATH=%1
)
执行将在到达ECHO后立刻终止,但没有任何说明原因。我相信很多人需要一些时间来弄清楚导致它的原因并修复它。以下方法将起作用:
IF (%1) == () (
ECHO Missing first parameter: path to the VB.NET source code files,
e.g. WindowsApplication1*.vb
EXIT /B 1
) ELSE (
SET SRCPATH=%1
)
此外,上面的示例演示了如何检查缺少的参数。这在C#或VB.NET中更有意义,只需与空string(例如“”)进行比较即可。
此批处理脚本中还有许多其他有用的代码片段,例如,如何使用延迟环境变量扩展,或者如何在FOR /F中使用双引号作为分隔符。我不会详细解释它——代码注释得很好,花一些时间自己研究一下。
本文最初发布于 Identifying used and unused resources in a Visual Studio’s project Resources.resx file | ToughDev
https://www.codeproject.com/Articles/5360390/Identifying-Used-and-Unused-Resources-in-a-Visual