了解 Visual Studio 中的资源

Understanding resources in Visual Studio

在 Visual Studio 中,我有几种方法可以将资源包含到我的项目中:

  1. 解决方案资源管理器 → 我的项目 → 右键单击​​ → 属性 → 资源 → 添加资源
  2. 将文件复制到解决方案目录 → 解决方案资源管理器 → 显示所有文件 → 右键单击​​ → 包含在项目中 → 右键单击​​ → 属性 → 生成操作 → 资源
  3. 将文件复制到解决方案目录 → 解决方案资源管理器 → 显示所有文件 → 右键单击​​ → 包含在项目中 → 右键单击​​ → 属性 → 构建操作 → 嵌入式资源
  4. 还有吗?

我的问题是:

存储空间

对于 #1,您添加的资源以 XML 格式存储在名为 Resources.resx 的文件中,通常位于 WinForms 或 WPF 应用程序的 Properties 子文件夹中使用默认 Visual Studio 模板创建。

对于 #2 和 #3,资源(文件)包含在项目中(即 Visual Studio 项目知道该文件,如果适用于该文件,它将被添加到源代码管理中项目等),不同之处在于编译器如何将文件的内容作为结果程序集的一部分。 #2 通常用于 WPF 应用程序; #3 用于 WinForms 应用程序。


访问

#1 (Resources.resx)

通过名为 Resources 的自动生成的 class 访问资源。例如,如果您添加一个名为 MyBitmap 的位图资源,您可以按如下方式访问它:

System.Drawing.Bitmap bitmap = Properties.Resources.MyBitmap;

#2(构建操作 = 资源)

可以从XAML(标记)或代码中引用资源。对于 XAML,一些标准控件支持资源引用。例如,Image 控件有一个默认引用嵌入资源的 Source 属性。要引用 WPF 项目根目录中包含的名为 "wpf.jpg" 的资源文件:

<Image Source="wpf.jpg" />

如果文件位于名为 "images" 的子文件夹中:

<Image Source="images/wpf.jpg" />

要从代码访问这些资源,您可以使用 Application class 的 GetResourceStream 方法,以 [=26= 的形式传递对所需资源的引用].使用上例中的文件:

Uri path = new Uri("images/wpf.jpg", UriKind.Relative);
StreamResourceInfo ri = Application.GetResourceStream(path);
Stream data = ri.Stream;

一旦你有了流,你就可以用它做你想做的事了。

#3(构建操作 = 嵌入式资源)

您需要获取对包含资源的程序集的引用,然后调用 GetManifestResourceStream 方法为其获取流。您对流执行的操作取决于您正在处理的资源类型。例如,这将从命名资源创建位图:

Bitmap bitmap = new Bitmap(
    System.Reflection.Assembly.GetEntryAssembly()
    .GetManifestResourceStream("resourcename"));

获取正确的资源名称可能很棘手。它通常是程序集名称、资源的文件夹和文件名的串联。例如,名为 "WindowsFormsApplication1" 的项目中名为 "Resources" 的文件夹中名为 "MyBitmap.bmp" 的文件将被编译为名为 WindowsFormsApplication1.Resources.MyBitmap.bmp 的资源。那就是您要传递给 GetManifestResourceStream 方法的字符串。


添加新资源

由于资源被编译到程序集(EXE 或 DLL)中,因此如果不重新编译程序集就无法添加新资源。据我所知,执行此操作的唯一编程方式是使用名为 Mono.Cecil.

的 NuGet 包