如何在不使用System.Windows.Forms的情况下编程地编写Resx文件而不会得到乱码
本文关键字:Resx 文件 编程 System Windows 情况下 Forms | 更新日期: 2023-09-27 18:07:13
我试图将键值对写入我的资源文件。我使用MSDN的代码(我知道这是我的第一个错误),保存文件后充满了垃圾。我没有windows窗体项目,所以我不想加载该命名空间。如果我绝对需要,我需要一种方法来避免运行时错误的代码库,当使用ResXResourceWriter类。
注意,类似问题的答案不成立。
using (FileStream fs = new FileStream(@"C:'Resource - Copy.resx", FileMode.Open))
using (var w = new ResourceWriter(fs))
{
while (lastKeyIndex > 0)
{
// Code to get key and value strings
w.AddResource(key, value);
}
w.Generate();
}
在notepad++中输出如下:
ÎÊï¾' lSystem.Resources。ResourceReader mscorlib,Version = 4.0.0.0、文化=中立,都必须要# System.Resources。RuntimeResourceSet
PADPADPÛ
_€»b€17sžƒ>·‚šþÑ‚Ç1ƒ¡ºŽƒ(A„‚ß'„” Ö„l–H…1¯…!®b†·C!‡§~f‡üÜ
‰s′w‰vК‰%
…稍后可读但不正确的文本和标记…
L b e L _ C o L o r/*"W o r k u p 2 _ L b e L _
出了什么问题或者它应该如何工作?
编辑注意:重复的问题不是重复的,因为它不是针对相同的项目类型。
这是在asp.net项目中。当我添加windows窗体引用时,我可以编译应用程序,但在ResXResourceWriter类上存在运行时错误。
CS0246:类型或命名空间名称'ResXResourceWriter'不能找到(您是否缺少using指令或程序集引用?)
正如taffer建议的那样,我使用XDocument来处理由于ResXResourceWriter类错误而导致的这种情况。
我使用下面的代码和foreach循环,围绕我需要批量插入到RESX文件中的数据源。为了简洁,我去掉了foreach循环。
唯一棘手的部分是正确添加xml:space属性,该属性正确显示在下面。
我是这样做的,以防其他人也想这样做。
XDocument xd;
using (FileStream fs = new FileStream(@"somepath'App_Code'Resource - Copy.resx"
, FileMode.Open, FileAccess.Read))
{
xd = XDocument.Load(fs);
}
XElement elm;
// Loop some data source here and build up your resx file
elm = new XElement("data"
, new XAttribute("name", key)
, new XAttribute(XNamespace.Xml + "space", "preserve")
, new XElement("value", value));
xd.Root.Add(elm);
// end loop
xd.Save(@"somepath'App_Code'Resource - Copy.resx");
最后,我使用它来利用多语言应用程序工具包插件。我在XAML中使用了另一个开发人员的语言文件,将他的所有英语都加载到我的测试项目resx文件中,然后使用工具包填充所有语言文件,然后编写一个自定义应用程序为每种语言生成匹配的XAML文件。
效果很好
从nugit包ResXResourceReader中使用System.resource.netstanders。NetStanderds
ResourceWriter
用于写入二进制.resources
文件。用System.Windows.Forms.dll
中的ResXResourceWriter
代替。
示例代码:
using (IResourceWriter writer = new ResXResourceWriter(file))
{
foreach (KeyValuePair<string, string> item in dictionary)
writer.AddResource(item.Key, item.Value);
}