了解Visual Studio中的资源

时间:2015-01-21 12:04:27

标签: c# visual-studio visual-studio-2012 resources

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

  1. Solution Explorer→我的项目→右键单击→属性→资源→添加资源
  2. 将文件复制到解决方案目录→解决方案资源管理器→显示所有文件→右键单击→包括在项目中→右键单击→属性→构建操作→资源
  3. 将文件复制到解决方案目录→解决方案资源管理器→显示所有文件→右键单击→包括在项目中→右键单击→属性→构建操作→嵌入式资源
  4. 还有一些吗?
  5. 我的问题是:

    • 这些资源有何不同?
    • 如何通过代码(C#)访问它们?
    • 是否可以按代码添加新资源?

1 个答案:

答案 0 :(得分:8)

存储

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

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


访问

#1 (Resources.resx)

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

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

#2 (构建操作=资源)

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

<Image Source="wpf.jpg" />

如果文件位于名为&#34;图像&#34;:

的子文件夹中
<Image Source="images/wpf.jpg" />

要从代码访问这些资源,请使用GetResourceStream类的Application方法,以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"));

获取正确的资源名称可能会非常棘手。它通常是程序集名称以及资源的文件夹和文件名的串联。例如,一个名为&#34; MyBitmap.bmp&#34;的文件。在名为&#34; Resources&#34;的文件夹中在名为&#34; WindowsFormsApplication1&#34;的项目中将被编译为名为WindowsFormsApplication1.Resources.MyBitmap.bmp的资源。这是您传递给GetManifestResourceStream方法的字符串。


添加新资源

当资源被编译到程序集(EXE或DLL)中时,如果不重新编译程序集,则无法添加新资源。我所知道的唯一以编程方式执行此操作的方法是使用名为Mono.Cecil的NuGet包。