2013-07-15 29 views
0

正如a previous question提到的,我有一组字符串资源,该方案的生命周期内不会改变,但只能通过在字符串列表昂贵的操作来获得的:不能在C#应用程序中使用非本地化的资源

public static class Patterns 
{  
    Public static readonly string StateUS = 
     @"\b(?<STATE>" + CharTree.GenerateRegex(FixedLists.StateUS) + @")\b"; 

    Public static readonly string Countries = 
     @"\b(?<STATE>" + CharTree.GenerateRegex(FixedLists.Countries) + @")\b"; 

    //..... 
} 

在试图提高性能,我已经产生用T4,它从文件中读取列表,并输出一个资源文件Regex.restext所需字符串:

StatesUS=A(LA(SK|BAM)A|RKANSAS)|B..... 
Countries=UNITED (STATES|KINGDOM)|CA(NAD|MBODI)A..... 

该文件然后被编译复制到ta rget目录生成后:

cd $(ProjectDir) 
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\resgen.exe" /compile Regex.restext 
copy /Y Regex.resources "$(TargetDir)MyProject.Resources.Lists.resources" 

但是,当我尝试加载静态构造函数中的这些值Patterns

ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("MyProject.Resources.Lists", @".\", null); 
StateUS = rm.GetString("StateUS") 

我收到以下错误:

InnerException: System.Resources.MissingManifestResourceException 
Message=Could not find any resources appropriate for the specified culture (or the neutral culture) on disk. 
System.Resources.FileBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 

但这是一个文化中立项目 - 资源仅用于存储。那么为什么我需要指定一种文化呢?我如何/在哪里可以这样做?

如果我采取了错误的方式来加载我的资源,这将是一个更好的方式来做到这一点?

+0

如果它如此静态,为什么不生成一次,然后复制并粘贴到您的源代码? –

+0

由于基础列表在软件版本之间经常变化。 – Arithmomaniac

回答

1

此异常告诉你的MyProject.Resources.Lists.resources文件未找到。也许文件路径或文件名本身不正确。我通过创建示例应用程序来验证您的示例,并且它工作正常。

您应该用Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location替换@".\"以确保您使用的资源文件位置正确。如果您在应用程序内的任何位置设置了Directory.SetCurrentDirectory("D:\\");,则@".\"会在您的资源中查找。

+0

是的......我在测试浏览器中运行NUnit测试,它在完全不同的文件夹中运行。很明显,依靠编译后复制是行不通的。 – Arithmomaniac

相关问题