从程序集中提取文字字符串
Posted
技术标签:
【中文标题】从程序集中提取文字字符串【英文标题】:Extract literal strings from assembly 【发布时间】:2012-07-20 00:45:49 【问题描述】:不太清楚在哪里问这个。
基本上,我负责我们产品的本地化。我需要一种从编译的程序集中提取所有文字字符串的方法。我需要获取行号和源文件(用于比较目的)。我一直在使用 FxCop,我刚刚创建了一个规则来吐出所有“ldstr”指令。但是,这依赖于过时的 FxCop(我相信)。我也考虑过使用 ildasm,但我找不到任何关于如何解析输出以可靠地检索我需要的信息的教程。
那么,有没有一个实用程序来处理这个问题?一个我没有想到的简单方法?我也想避免像 ReSharper 这样的扩展,因为它只在您的解决方案的当前状态下运行;例如我无法生成用于比较的输出。
【问题讨论】:
是的,我有来源。我需要有源代码才能进行本地化....对吗?找到文字字符串后,我将它们添加到相应的 .resx 文件中。 【参考方案1】:ildasm 可以做到这一点:
ildasm.exe /text /metadata=heaps mscorlib.dll >out.txt
// User Strings
// -------------------------------------------------------
// 70000001 : ( 4) L"info"
// 7000000b : ( 2) L", "
// 70000011 : ( 5) L"value"
// 7000001d : ( 1) L"D"
...
【讨论】:
这并不完全符合我的需要,但足以取代 FxCop。谢谢!【参考方案2】:如果您使用的是 Visual Studio,则可以运行以下宏
Sub TemporaryMacro()
DTE.ExecuteCommand("Edit.FindinFiles")
DTE.Find.FindWhat = ":q"
DTE.Find.Target = vsFindTarget.vsFindTargetFiles
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.MatchInHiddenText = True
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
DTE.Find.SearchPath = "C:\yourproject"
DTE.Find.SearchSubfolders = True
DTE.Find.FilesOfType = "*.*"
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1
DTE.Find.Action = vsFindAction.vsFindActionFindAll
End Sub
基本上它是在一个目录中对 :q 引用字符串进行正则表达式搜索,这将为您提供源代码中的所有引用字符串
【讨论】:
这是一个不错的备份解决方案!我不知道我能做到这一点。有没有办法将输出导出到一个文件中,该文件包含找到的每个 ":q" 的行号和源文件?【参考方案3】:很明显,很棒的Cecil OSS 框架在这里很有用。它会让你在汇编文件中轻松找到字符串文字。
需要做更多的工作才能找回源文件中的字符串。精明之处在于在程序集的文本源文件的内容中搜索以找到所有字符串声明:
像@"my""string"
一样逐字逐句
或经典如"my\"string"
程序集的源文件列表可以从Cecil.PDB子框架中获取。
【讨论】:
以上是关于从程序集中提取文字字符串的主要内容,如果未能解决你的问题,请参考以下文章