从外部创建的.resx文件访问资源

问题描述:

我的主要Windows窗体(托管C++)项目具有一个类,该类显示可显示或隐藏以创建响应图的图块的图像。从外部创建的.resx文件访问资源

我创建了一个单独的实用程序的应用程序,可以帮助我得到的所有图像正确定位,等等。这个程序是用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方法看起来更优雅...

原来的秘密是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,而我的使用涉及添加一个在外部创建的.resx,所以我认为这是一个不同的情况,以保证单独的Q/A。