在Visual Studio中,我有几种方法可以将资源包含到我的项目中:
我的问题是:
答案 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包。