从外部创建的.resx文件

时间:2017-09-25 14:18:10

标签: c# winforms c++-cli resx

我的主要Windows窗体(托管C ++)项目有一个类,它使用可显示或隐藏的图块呈现图像,以创建响应图。

我创建了一个单独的实用程序应用程序,可帮助我正确定位所有图像等。此应用程序是用C#编写的,并使用以下代码片段写入包含图像数据和定位的.resx文件:

using(ResXResourceWriter resx = new ResXResourceWriter(sfd.FileName)) {
    resx.AddResource("Size", canvas.Size);
    List<int> IDs = canvas.IDs;
    resx.AddResource("IDList", IDs);
    resx.AddResource("BackgroundIndex", canvas.BackgroundIndex);
    foreach(int id in IDs) {
        String positionKey = String.Format("Position.id{0}", id);
        String visibilityKey = String.Format("Visibility.id{0}", id);
        String imageKey = String.Format("Image.id{0}", id);
        resx.AddResource(imageKey, canvas.TileImage(id));
        resx.AddResource(positionKey, canvas.TilePosition(id));
        resx.AddResource(visibilityKey, canvas.TileVisible(id));
    }
}

我可以在文本编辑器中打开.resx文件,看看它是否格式正确,并包含预期的数据。

然后我把那个.resx文件添加到我的主应用程序的项目中。现在我无法弄清楚如何获取其中的资源。我试过的代码是:

ResourceManager ^ image_rm = gcnew ResourceManager(
    "resx_file_name_without_extension", GetType()->Assembly);
ResourceSet ^ image_rs = image_rm->GetResourceSet(
    System::Globalization::CultureInfo::CurrentCulture, true, true);

在运行时,第二行(GetResourceSet调用)会抛出System.Resources.MissingManifestResourceException,并显示以下消息文本:

  

资源加载失败:   无法找到适合指定文化的任何资源或   中性文化。确保“resx_file_name_without_extension.resources”是   在编译时正确嵌入或链接到程序集“my_assembly”,或   所需的所有卫星组件都是可装载和完全签名的。

我怀疑我的问题是......我真的不知道。也许我没有在ResourceManager构造函数中使用正确的标识符。我尝试在文件的属性中明确设置“从构建中排除:”和“内容:”,但这没有效果。

甚至可以将外部创建的.resx文件放入项目中并获取其中的资源吗?我绝对需要它编译;我无法发送悬挂.resx文件的产品。我总是可以在.cpp文件中创建一组静态数据对象,但.resx方法似乎更优雅......

1 个答案:

答案 0 :(得分:0)

原来对this unanswered question的评论是秘密的。将根命名空间添加到标识符使ResourceManager满意:

ResourceManager ^ image_rm = gcnew ResourceManager(
    "my_root_namespace.resx_file_name_without_extension", GetType()->Assembly);
ResourceSet ^ image_rs = image_rm->GetResourceSet(
    System::Globalization::CultureInfo::CurrentCulture, true, true);

编译器决定将资源放在该命名空间中的方式或原因对我来说仍然有点神秘,但这是另一天的琐事。

我链接的问题涉及在项目中使用VS创建的.resx,而我的涉及添加一个外部创建的问题,所以我认为这是一个不同的情况,需要单独的Q / A.