gpt4 book ai didi

c# - 了解 Visual Studio 中的资源

转载 作者:太空狗 更新时间:2023-10-29 20:16:41 27 4
gpt4 key购买 nike

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

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

我的问题是:

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

最佳答案

存储

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

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


访问

#1(资源.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”的文件将被编译为名为 WindowsFormsApplication1.Resources.MyBitmap.bmp 的资源。这是您要传递给 GetManifestResourceStream 方法的字符串。


添加新资源

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

关于c# - 了解 Visual Studio 中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com