Read a string stored in a resource file (resx) with dynamic file name

巧了我就是萌 提交于 2019-12-09 09:07:01

问题


In my C# application I need to create a .resx file of strings customized for every customer.

What I want to do is avoid recompiling the entire project every time I have to provide my application to my customer, so I need to dynamic access to this string. So, how can I access (during the app execution) to a resx file if I kwow the file name only on the execution time?

Since now I write something similar:

Properties.Resources.MyString1

where Resource is my Resource.resx file. But I need something like this:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1");

Is it possible?

Thanks Mark


回答1:


Will something like this help in your case?

Dictionary<string, string> resourceMap = new Dictionary<string, string>();

public static void Func(string fileName)
{
    ResXResourceReader rsxr = new ResXResourceReader(fileName);        
    foreach (DictionaryEntry d in rsxr)
    {
        resourceMap.Add(d.Key.ToString(),d.Value.ToString());           
    }        
    rsxr.Close();
}

public string GetResource(string resourceId)
{
    return resourceMap[resourceId];
}



回答2:


You could put the needed resources into a separate DLL (one for each customer), then extract the resources dynamically using Reflection:

Assembly ass = Assembly.LoadFromFile("customer1.dll");
string s = ass.GetManifestResource("string1");

I may have the syntax wrong - it's early. One potential caveat here: accessing a DLL through Reflection will lock the DLL file for a length of time, which may block you from updating or replacing the DLL on the client's machine.




回答3:


Of course it is possible. You need to read about ResouceSet class in msdn. And if you want to load .resx files directly, you can use ResxResourceSet.




回答4:


Use LINQ to SQL instead of referencing System.Windows.Forms.ResXResourceReader class in your project.

public string GetStringFromDynamicResourceFile(string resxFileName, string resource)
{
    return XDocument
                .Load(resxFileName)
                .Descendants()
                .FirstOrDefault(_ => _.Attributes().Any(a => a.Value == resource))?
                .Value;
}

And use it:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1");


来源:https://stackoverflow.com/questions/1097154/read-a-string-stored-in-a-resource-file-resx-with-dynamic-file-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!