Visual Studio:如何将图像资源存储为嵌入式资源?

25
默认情况下,当您将图像(图标、位图等)作为资源添加到项目中时,该图像的“生成操作”设置为“无”。这是因为该图像神奇地存储在.resources文件中。
我希望资源被存储为嵌入式资源(我的原因不重要,但让我们假装这样做是为了能够在RedGate's Reflector中看到它们)。
因此,我将每个图像的“生成操作”更改为“嵌入式资源”,然后资源就会出现在Lutz的Reflector中——正如我所希望的那样。
不幸的是,Microsoft明确表示不应该这样做
请注意,当资源编辑器添加图像时,它将“生成操作”设置为“无”,因为.resx文件引用图像文件。在构建时,图像被拉入由.resx文件创建的.resources文件中。然后可以通过为.resx文件自动生成的强类型类轻松访问该图像。
因此,您不应将此设置更改为“嵌入式资源”,因为这样做会在程序集中包含两次图像。

那么,将图像作为嵌入式资源包含的正确方式是什么?

4个回答

43

注意:本答案并不是处理图像资源的推荐方式,它只是解决了问题(即将图像作为嵌入式资源包含在内)描述的特定问题。

不要将图像添加为资源。我宁愿采取以下步骤:

  • 创建图像/图标并将其保存到文件中
  • 选择“项目”->“添加现有项”,并添加文件
  • 将“生成操作”设置为“嵌入式资源”

然后您可以使用以下方式访问此资源

Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceUri)

以这种方式,图像并没有神奇地添加到项目的资源文件中,您只会在程序集的资源中存储一份图像拷贝。


3
但是因为原帖作者明确希望将资源存储为嵌入式资源,所以我猜他必须使用GetManifestResourceStream方法来访问它。 - Dirk Vollmar
2
请注意,这会使图像无法本地化。Todd的回答解释得很好。 - Clafou
3
如果你正在获取ManifestResourcesStream,99%的情况下你是在做错误的事情。我讨厌看到这种情况发生,因为新手可能会尝试使用这种方式来处理资源,而不是通过属性编辑器进行处理。 - user1228
1
@Will:我同意,我的答案所描述的解决方案通常不是处理图像资源的首选方式。我在开头添加了一条说明性注释。 - Dirk Vollmar
7
“@Will - 对于我们这些新手来说,能够提供一个指向“正确方法”的链接会很不错(如果这样的链接存在的话)。 - Vaccano
显示剩余2条评论

15
在项目视图中,展开“属性”子树;双击“Resources.resx”项。
(如果没有,请右键单击“属性”项并选择“打开”,然后在左侧单击“资源”选项卡,在页面中间单击链接以创建默认的资源文件。)
在 resources.resx 页面的顶部点击第一个下拉列表。它可能显示一些无用的内容,比如“Strings”,请改为选择“Images”。或者您也可以按下 Ctrl + 2 快捷键。这将切换到图像资源视图。现在,单击“添加资源”下拉列表,并选择“现有文件”。选择您的图像文件并单击“打开”。如果需要,可以重命名资源。
点击保存图标。
现在,您可以通过编程方式访问嵌入式资源:
[namespace].Properties.Resources.[yourResourceName]

6

在 VS 2005 中:

  • 右键单击您的项目,选择添加新项。
  • 添加资源文件。将其命名为myImages.resx
    将此文件放置在项目的根文件夹中。
  • 右键单击myImages.resx并选择“查看设计器”
  • 选择添加资源,添加现有文件。
  • 浏览图像,例如stop.bmp
    此时不必包含此图像在项目中。资源文件会自动执行此操作。

要在代码中引用图像,请使用以下内容:

btnStop.Image = myImages.Stop;

5
这取决于您想如何使用图像。
如果您想本地化并访问特定文化的特定图像,则使用 ResourceManager 是一个不错的选择,因为它提供了一些很好的卫星程序集、搜索、回退等功能。
如果您只想将资源嵌入程序集中,并且不担心本地化(使用 Assembly.GetManifestResourceStream),那么只需添加一个图像并将构建操作设置为 Embedded Resource 即可。
文档警告您不要将构建操作设置为 Embedded Resource,因为资源编译器通过 .resx 文件已经将资源编译到程序集中。

但是,如何将生成操作设置为嵌入式资源,而不是重复包含呢? - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接