存储
对于 #1,您添加的资源以 XML 格式存储在名为 Resources.resx 的文件中,该文件通常位于使用默认 Visual Studio 模板创建的 WinForms 或 WPF 应用程序的 Properties 子文件夹中。
对于#2 和#3,资源(文件)包含在项目中(即,Visual Studio 项目知道该文件,如果适用于项目等,它将被添加到源代码管理中),不同之处在于编译器如何将文件的内容作为结果程序集的一部分包含在内。 #2 通常用于 WPF 应用程序; #3 用于 WinForms 应用程序。
访问
#1 (Resources.resx)
通过名为Resources 的自动生成类访问资源。例如,如果您添加一个名为 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 类的GetResourceStream 方法,以pack URI 的形式传递对所需资源的引用。使用上例中的文件:
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”的文件将被编译为名为@987654337@ 的资源。这就是您要传递给GetManifestResourceStream 方法的字符串。
添加新资源
由于资源被编译到程序集(EXE 或 DLL)中,如果不重新编译程序集,就无法添加新资源。我知道的唯一编程方式是使用一个名为Mono.Cecil 的 NuGet 包。