如何获取项目Languages文件夹内嵌入式resx文件的名称?
获取项目Languages文件夹内嵌入式resx文件名称的解决方案
你当前的代码问题在于嵌入式资源的完整名称包含项目命名空间前缀,比如你的项目命名空间是YourProjectName,那资源名格式会是YourProjectName.Languages.XXX.resx.resources(编译后resx会转为resources后缀),直接用StartsWith("Languages")根本匹配不到。
下面是修正后的可行方案:
方案1:基于包含匹配的简化写法
using System.Reflection; Assembly assembly = Assembly.GetExecutingAssembly(); string[] resourceNames = assembly.GetManifestResourceNames(); // 用带点的前缀避免和命名空间里的字符串误匹配 string folderMarker = ".Languages."; foreach (string resourceName in resourceNames) { // 编译后resx文件的资源扩展名是.resources,所以匹配这个后缀 if (resourceName.Contains(folderMarker) && resourceName.EndsWith(".resources")) { // 提取Languages文件夹后的文件名,并还原.resx后缀 int startIndex = resourceName.IndexOf(folderMarker) + folderMarker.Length; string fileName = resourceName.Substring(startIndex).Replace(".resources", ".resx"); Console.WriteLine(fileName); } }
方案2:正则表达式精准匹配
如果需要更严谨的匹配(比如避免嵌套文件夹干扰),可以用正则:
using System.Reflection; using System.Text.RegularExpressions; Assembly assembly = Assembly.GetExecutingAssembly(); string[] resourceNames = assembly.GetManifestResourceNames(); // 匹配Languages文件夹下的resx资源,提取原文件名 Regex resourceRegex = new Regex(@".*Languages\.([^\.]+\.resx)\.resources$"); foreach (string resourceName in resourceNames) { Match match = resourceRegex.Match(resourceName); if (match.Success) { Console.WriteLine(match.Groups[1].Value); } }
关键注意事项
- 确保所有目标resx文件的生成操作设置为「嵌入式资源」(右键文件→属性→生成操作,选择对应选项)
- 如果项目有多层嵌套命名空间,无需额外修改代码,因为正则和包含匹配会自动适配完整资源名
- 编译后的resx资源会自动添加
.resources后缀,所以代码里要匹配这个后缀再还原回.resx
内容的提问来源于stack exchange,提问作者user6473719
相关产品推荐
相关产品推荐

