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

Visual studio VisualStudio:如何将图像资源存储为嵌入式资源?,visual-studio,image,Visual Studio,Image,默认情况下,将图像(图标、位图等)作为资源添加到项目中时,图像的生成操作设置为无。这是因为图像神奇地存储在.resources文件中 我希望将资源存储为嵌入式资源(我的理由与此无关,但让我们假设是这样,以便我可以在中看到它们) 因此,我将每个图像的构建操作更改为嵌入式资源,然后该资源出现在Lutz的反射器中-完全如我所愿 不幸的是: 请注意,当资源编辑器 添加图像,它将构建操作设置为 无,因为.resx文件 引用图像文件。建造时 此时,图像将被拉入 .resources文件已从中创建 .resx

默认情况下,将图像(图标、位图等)作为资源添加到项目中时,图像的生成操作设置为。这是因为图像神奇地存储在.resources文件中

希望将资源存储为嵌入式资源(我的理由与此无关,但让我们假设是这样,以便我可以在中看到它们)

因此,我将每个图像的构建操作更改为嵌入式资源,然后该资源出现在Lutz的反射器中-完全如我所愿

不幸的是:

请注意,当资源编辑器 添加图像,它将构建操作设置为 ,因为.resx文件 引用图像文件。建造时 此时,图像将被拉入 .resources文件已从中创建 .resx文件。这样,图像就可以很容易地显示出来 可以通过强类型 为.resx自动生成的类 文件

因此,你不应该改变 将此设置设置为嵌入式资源
, 因为这样做会包括 在程序集中镜像两次


那么,将图像作为嵌入资源的正确方法是什么呢?

这取决于您希望如何使用图像

如果您想本地化和访问特定区域性的特定图像,那么使用
ResourceManager
是一个很好的方法,因为它为附属程序集、搜索、回退等提供了一些很好的功能

如果您只想在程序集中嵌入资源,而不担心本地化(使用
assembly.GetManifestResourceStream
),那么只需添加一个映像并将构建操作设置为
嵌入资源即可

文档警告您不要将生成操作设置为
Embedded Resource
,因为资源编译器已通过.resx文件将资源编译到程序集中。

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

不要将图像添加为资源。我宁愿这样做:

  • 创建图像/图标并将其保存到文件中
  • 选择项目->添加现有项并添加文件
  • 将生成操作设置为Embedded Resource
然后,您可以使用

Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceUri)
这样,映像就不会神奇地添加到项目资源文件中,并且程序集资源中只存储了映像的一个副本。

在VS 2005中:

  • 右键单击您的项目,然后单击 选择添加新项目
  • 添加一个资源文件。电话是 myImages.resx
    将此文件放在项目的根文件夹中
  • 右键单击myImages.resx 然后选择视图设计器
  • 选择添加资源,添加现有资源 文件
  • 浏览图像,例如stop.bmp
    在本阶段,此图像不必包含在项目中。资源文件将自动执行此操作
要在代码中引用图像,请使用以下内容:

btnStop.Image = myImages.Stop;

在项目视图中,打开属性子树;双击Resources.resx项目

(如果没有一个,右键单击属性项并选择Open,然后单击左边的资源选项卡,然后单击页面中间的链接以创建默认资源文件)。 单击resources.resx页面顶部的第一个droplist。它可能会说一些无用的东西,比如“字符串”,然后选择图像。或者,您可以按Ctrl+2。这将更改为“图像资源”视图。现在单击添加资源下拉列表并选择“现有文件”。选择图像文件并单击“打开”。如果愿意,请重命名资源

单击保存图标

现在,您可以通过以下方式以编程方式访问嵌入式资源:

[namespace].Properties.Resources.[yourResourceName]

但是如何将构建操作设置为Embedded Resource,而不将其双重包含?此解决方案的缺点是无法获取资源的自动生成名称(例如,在VB.NET中,My.Resources.NameOfYourImage。但是如果你不介意的话,那么这可能是最好的解决方案。但是由于OP肯定希望将资源存储为嵌入式资源,我猜他必须使用GetManifestResourceStream方法来访问它。请注意,这会使图像无法本地化。Todd的answer很好地解释了这一点。如果你得到的是一个ManifestResourcesStream,99%的时间你都是错的。我讨厌看到这种情况,因为noobs可能会尝试以这种方式而不是通过属性编辑器来处理资源。@Will-最好(对于我们noobs:)有一个指向“正确方式”的链接(如果存在这种链接的话)。