Visual Studio 如何使用字符串资源文件?

ax6ht2ek  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(329)

我正在使用Visual Studio 2022,我正在努力弄清楚如何正确地嵌入和使用资源文件,以便使用GetString()
teadates.txt:

DEC=December
MAR=March

基于Micrsoft的documentation,我使用ResGen生成了一个资源二进制文件:

resgen teadates.txt

这产生了一个teadates.resources文件。我尝试了多种方法来嵌入这个teadates.resources文件,但似乎都不起作用。
嵌入方式一:
1.右键单击项目〉〉Properties
1.在右窗格中单击Resources
1.我在这里添加现有的teadates.resources文件
嵌入方式二:
1.在Solution Explorer中找到teadates.resources文件
1.在Properties中,将Build Action设置为Embedded Resource
代码:

// Fails to compile
// CS0234: The type or namespace name 'teadates' does not exist
//     in the namespace 'TeaSpace' (are you missing an assembly reference?)
String tmp1 = TeaSpace.teadates.ResourceManager.GetString("DEC");

// Fails to compile
// CS1061: 'byte[]' does not contain a definition for 'ResourceManager'
//     and no accessible extension method 'ResourceManager' accepting a
//     first argument of type 'byte[]' could be found (are you missing a
//     using directive or an assembly reference?)
String tmp2 = TeaSpace.Properties.Resources.teadates.ResourceManager.GetString("DEC");

// Compiles, fails on runtime when executing rm.GetString("DEC")
// System.Resources.MissingManifestResourceException: 'Could not find any
//     resources appropriate for the specified culture or the neutral culture.
//     Make sure "teadates.resources" was correctly embedded or linked into
//     assembly "TeaCup" at compile time, or that all the satellite assemblies
//     required are loadable and fully signed.'
ResourceManager rm = new ResourceManager("teadates", Assembly.GetExecutingAssembly());
String tmp3 = rm.GetString("DEC");

// Compiles, doesn't fail on runtime, but rm.GetString("DEC") returns null
ResourceManager rm = new ResourceManager("TeaSpace.Properties.Resources", Assembly.GetExecutingAssembly());
String tmp4 = rm.GetString("DEC");

tmp1是完全错误的。它甚至没有找到资源。tmp2似乎找到了它,但它不能使用ResourceManager,因为它是一个byte[]tmp3编译,因为它似乎没有在编译时检查文件,而只在运行时检查。tmp4编译,但在运行时没有失败,但返回null。
我试过搜索,包括StackOverflow。我发现了诸如this之类的问题,但所有的答案都掩盖了所有的细节。它们都只有使用ResourceManagerProperties的代码,我在上面尝试过,但没有成功。我链接的Microsoft文档在编译之前都很好。它使用命令行,而我尝试使用IDE。

ui7jx7zq

ui7jx7zq1#

您可以按照下列步骤嵌入.txt字符串资源文件:
1.将.txt文件添加到项目中。
1.在.txt文件的“属性”窗口中,将“生成操作”设置为“嵌入资源”。
1.编辑.csproj文件,找到.txt文件的<EmbeddedResource>元素,然后添加两个子元素:

<EmbeddedResource Include="teadates.txt">
  <ManifestResourceName>TeaDates</ManifestResourceName>
  <Type>Resx</Type>
</EmbeddedResource>

1.使用ResourceManager.getString读取资源值:

ResourceManager rm = new ResourceManager("TeaDates", Assembly.GetExecutingAssembly());
Console.WriteLine(rm.GetString("MAR")); // March

ResourceManager构造函数的第一个参数必须与.csproj文件中的<ManifestResourceName>匹配。

qojgxg4l

qojgxg4l2#

将字符串从文本文件添加到C# Visual Studio项目的分步说明。
1.您有一个文本文件teadates.txt,其内容如下

DEC=December
MAR=March

1.在命令行上执行此命令:
resgen teadates.txt teadates.resx
注意,我们将扩展名为resx的文件指定为目标文件,以便使用XML resx而不是binary *.resources格式。
1.在Visual Studio中,右键单击项目,选择“添加现有项”,然后选择teadates.resx文件。
1.在解决方案资源管理器中选择新添加的文件并更改这些属性:
Custom Tool设置为ResXFileCodeGenerator

请注意,teadates.Designer.cs文件现在自动添加到解决方案资源管理器中。
1.现在,您可以通过teadates.DEC等代码访问字符串资源

或者访问资源管理器:

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(teadates.DEC);
        Console.WriteLine(teadates.ResourceManager.GetString("DEC"));
    }
}

相关问题