从.NET程序集(dll)中获取所有静态(内部化)字符串

15
我希望获得一个包括“静态”值、传递给方法的参数、设置字段等在内的所有使用在.NET程序集中的字符串列表。
我想起来很久以前读过一些东西,说.NET程序集包含了它所使用的所有字符串表(或者它们可以被"interned"),难道这只是我的幻想吗?
使用.NET Reflector是个好主意(感谢thijs),如果没有人提供已经编写好的工具,我也会看看它的API。
(这样我就可以编写一个工具来检查我们是否漏掉了应翻译的任何字符串。我可以处理C#源代码,但是那样我必须应对分布在多行上的字符串等问题。)
我刚才想到,我希望排除传递给CodeFlowException()等的字符串,所以这已经变得更加复杂了。
PS:如果你能想到更好的标签,请重新标记这个问题。

不需要编写工具,已经存在一个。 - Mitch Wheat
我确实需要一个定制工具,因为我需要在获取字符串后对其进行更多处理。但是,我非常乐意使用另一个工具输出的字符串列表来提供我的工具。 - Ian Ringrose
尝试将您的程序集加载到Reflector中,如果Reflector看到的内容对您来说足够好,那么您也可以使用System.Reflection访问它。 - thijs
5个回答

14
你可以使用SysInternals Strings工具来查看可执行文件和目标文件中的字符串。

使用此工具,您还将获得诸如“!此程序无法在DOS模式下运行”的内容,这不是源代码中编写的,而是由编译器添加的。如果您运气不好,您还将获得GUID和Base64编码的资源。所有这些都会给您带来大量的工作,以便从实际需要翻译的字符串中分离出垃圾信息。 - thijs

3

对于那些想从.NET程序集(.exe或.dll)中提取所有用户字符串的人,我编写了一个简单实用工具可以实现这个功能(文件名为ExtractExeNetStrings2.zip)。 该工具使用C#编写。


整洁,但它为什么能够从自身组装的部分拾取“hotovo... ”而不能拾取“.txt.”,“Exception:”,“按下某个键...”,“#US”等内容? - Jason Kleban

2

这是一个简单的C#实用程序,通过检查二进制文件的位来从.NET程序集(.exe或.dll)中提取所有用户字符串。

vladob的答案中的源代码现在可以在github上找到。原始答案中的链接已经失效。vladob同意了重新发布。实际上,我同意了自己重新发布。


2

反射?为什么要走弯路呢! ;) - Mitch Wheat
因为“字符串”也会给出所有你没有自己编写的字符串吗?(例如函数和变量的名称) - thijs
你可能不想/需要将它们本地化,但你仍然可能想要查看它们以检查命名标准、质量保证、F-bombs等。 - GWLlosa
1
伙计们,发帖者正在寻求一种获取字符串以便进行翻译的方法,而不是强制命名标准或其他任何事情... - Mitch Wheat
传递给方法等的字符串怎么处理? - Ian Ringrose
我的前一条评论是指“为什么要走弯路”... 走弯路是因为简单的方法不够好... - thijs

0
最终,我编写了一个非常简单的C#解析器,用于在源代码中查找字符串。这解决了我的问题,并让我添加“注释”以帮助翻译人员。
这些注释只是从C#注释中以“魔法格式”读取的。
(很抱歉,这个解析器不够好,无法让其他人使用它,它只能勉强运行在我的C#代码库上)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接