ASP.NET MVC5项目快速本地化:如何提取所有硬编码字符串?
提取ASP.NET MVC5项目中所有硬编码字符串的实用方案
针对你ASP.NET MVC5项目里需要提取所有硬编码字符串的需求,我之前帮朋友处理过类似场景,试过几个靠谱的方案,能覆盖ReSharper和NDepend没抓到的角落,给你详细说说:
1. 基于Roslyn的自定义字符串提取工具
Roslyn是.NET的编译器平台,能深度遍历代码的语法树,不管是Controllers里的C#代码,还是CSHTML视图里的Razor代码,都能精准抓到所有字符串字面量。你可以写一个简单的控制台程序来实现:
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.IO; using System.Linq; class StringExtractor { static void Main(string[] args) { // 遍历项目里的所有.cs和.cshtml文件 foreach (var filePath in Directory.EnumerateFiles(@"你的项目根路径", "*.*", SearchOption.AllDirectories) .Where(f => f.EndsWith(".cs") || f.EndsWith(".cshtml"))) { var code = File.ReadAllText(filePath); var tree = CSharpSyntaxTree.ParseText(code); var root = tree.GetRoot(); // 查找所有字符串字面量节点 var stringLiterals = root.DescendantNodes().OfType<LiteralExpressionSyntax>() .Where(l => l.Kind() == SyntaxKind.StringLiteralExpression); foreach (var literal in stringLiterals) { Console.WriteLine($"文件: {filePath} | 字符串: {literal.Token.ValueText}"); } } } }
这个程序会输出所有.cs和.cshtml文件里的硬编码字符串,哪怕是单个字符的"a"也不会漏掉。
2. Visual Studio正则全局查找(快速上手)
如果不想写代码,用VS自带的全局查找功能配合正则表达式就能快速搞定:
- 打开VS的“查找和替换”窗口(Ctrl+Shift+F)
- 查找内容输入正则:
"(.*?)" - 选择“整个解决方案”,并勾选“使用正则表达式”
- 点击“查找全部”,就能看到所有匹配的硬编码字符串
虽然会抓到一些不需要的(比如配置文件里的字符串),但你可以通过筛选文件类型(只看.cs和.cshtml)来缩小范围,适合临时快速提取。
3. StyleCop Analyzers 代码规范工具
StyleCop Analyzers不仅能检查代码规范,还能配置规则检测所有硬编码字符串:
- 在NuGet里给项目安装
StyleCop.Analyzers包 - 打开项目的
.editorconfig文件,添加规则:dotnet_diagnostic.SA1300.severity = warning(这个规则检测非资源文件的硬编码字符串) - 等待VS分析完成后,在“错误列表”里就能看到所有硬编码字符串的位置,还能导出报告
它能自动排除资源文件里的字符串,同时覆盖C#代码和Razor视图。
4. PowerShell脚本遍历CSHTML视图
如果主要担心视图里的字符串没被抓到,可以写个简单的PowerShell脚本,遍历所有.cshtml文件提取字符串:
$projectPath = "你的项目根路径" Get-ChildItem -Path $projectPath -Filter *.cshtml -Recurse | ForEach-Object { $content = Get-Content $_.FullName -Raw $strings = [regex]::Matches($content, '"([^"]*)"') | ForEach-Object { $_.Groups[1].Value } foreach ($str in $strings) { Write-Host "文件: $($_.FullName) | 字符串: $str" } }
这个脚本会提取视图里所有用双引号包裹的字符串,配合前面的C#代码提取,就能覆盖整个项目。
小提示
如果后续需要过滤掉无意义的短字符串(比如"a"),可以在提取结果里用简单的字符串长度过滤,比如只保留长度大于2的字符串,这样能减少后续整理的工作量。
内容的提问来源于stack exchange,提问作者advapi
相关产品推荐
相关产品推荐

