如何在不使用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指令或程序集引用?)

如何在不使用System.Windows.Forms的情况下编程地编写Resx文件而不会得到乱码

正如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);
}