Jon*_*age 1 .net resources resx c++-cli manifest
我有一个控件库,我已将 .resx 文件添加到其中(ImageResources.resx)。它包含两个我随后添加的 .png 图像。
在同一个库中,我有一个控件,可以加载几个图像来进行一些自定义绘图,但我似乎无法加载资源:
void GTableLayoutPanel::SetBorderImagesFromManifest(String^ topLeftCornerImageName, String^ topImageName)
{
// Grab the assembly this is being called from
Assembly^ assembly = Assembly::GetExecutingAssembly();
// Grab the images from the assembly
Stream^ stream = assembly->GetManifestResourceStream(topLeftCornerImageName);
Image^ topLeftImage = System::Drawing::Image::FromStream(stream);
stream = assembly->GetManifestResourceStream(topImageName);
Image^ topImage = System::Drawing::Image::FromStream(stream);
// Update the internal store from the supplied images
SetBorderImages(topLeftImage, topImage);
}
Run Code Online (Sandbox Code Playgroud)
...给我错误抱怨为stream空,这表明我的呼叫GetManifestResourceStream失败。
图像被调用group_box_top.png,group_box_top_left.png并且我调用图像加载器,如下所示:
SetBorderImagesFromManifest("group_box_top_left.png", "group_box_top.png");
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
SetBorderImagesFromManifest("group_box_top_left", "group_box_top");
Run Code Online (Sandbox Code Playgroud)
...因为文件出现在 .resx 文件中,没有 .png 扩展名,但这会产生相同的错误。
我在这里错过了一步吗?
[编辑]我尝试了最后一个链接中的建议,我得到:
MyControlsLib.ImageResources.resources
Run Code Online (Sandbox Code Playgroud)
所以现在我尝试参考:
Stream^ strm1 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.resources.group_box_top_left");
Stream^ strm2 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.resources.group_box_top_left.png");
Stream^ strm3 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.group_box_top_left");
Stream^ strm4 = assembly->GetManifestResourceStream("MyControlsLib.ImageResources.group_box_top_left.png");
Run Code Online (Sandbox Code Playgroud)
...所有这些都返回 nullptr :-/
我终于得到了 C++/CLI 解决方案的神奇组合。因此,以防万一其他人遇到此问题:
Resource Files要添加到的项目Add>New Item..Visual C++>> 。Resource Assembly Resource File (.resx)我将其命名为“ImageResources.resx”Add Resource并选择Add Existing File...group_box_top.png和 ,group_box_top_left.png它在 .resx 文件中显示为group_box_top和group_box_top_left。然后,您可以使用以下命令从清单中获取图像:
// Grab the assembly this is being called from
Assembly^ assembly = Assembly::GetExecutingAssembly();
AssemblyName^ assemblyName = assembly->GetName();
// Grab the images from the assembly
ResourceManager^ rm = gcnew ResourceManager(assemblyName->Name+".ImageResources", assembly);
Bitmap^ topLeftImage = (Bitmap^)rm->GetObject("group_box_top_left");
Bitmap^ topImage = (Bitmap^)rm->GetObject("group_box_top");
Run Code Online (Sandbox Code Playgroud)
请注意,ImageResources传递给ResourceManager构造函数的字符串必须与 .resx 文件的名称匹配。
Linker->InputEmbed Managed Resource File属性中的文件。我PingSend.wav在这里添加了。要访问这些文件,只需执行以下操作:
System::Reflection::Assembly^ assembly = Assembly::GetExecutingAssembly();
System::Media::Sonudplayer^ pingPlayer = gcnew System::Media::SoundPlayer(assembly->GetManifestResourceStream("PingSend.wav"));
Run Code Online (Sandbox Code Playgroud)
...在本例中,加载准备播放的音频文件。