资源文件(.resx)与反射以访问嵌入式资源

w12*_*128 6 .net c# reflection embedded-resource visual-studio

我可能在这里遗漏了一些非常简单的东西,但是使用反射从包含资源同一程序集中检索嵌入资源而不是简单地通过.resx文件检索它有什么好处?我看到了很多但是没有得到它 - Assembly.GetExecutingAssembly().GetManifestResourceStream(resource)与resx文件相比,是否有理由使用Resources.resource?甚至微软也这样做:如何嵌入和访问资源.

我的意思是:假设我有一个MyAssembly包含嵌入式资源的程序集Config.xml.程序集MyClass实现了一个以字符串形式返回所述资源的方法:

public string GetConfigXML() // returns the content of Config.xml as a string
Run Code Online (Sandbox Code Playgroud)

通常,我看到这样实现,使用反射来检索资源:

public string GetConfigXML()
{
    Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Config.xml"); 
    string xml = GetStringFromStream(xmlStream);
    return xml;
}
Run Code Online (Sandbox Code Playgroud)

为什么GetManifestResourceStream()在可以的时候使用:

  1. 在Visual Studio中Resource.resxMyAssembly项目添加资源文件();
  2. 添加Config.xml到资源的'文件';
  3. Config.xml以更简单的方式获取内容:string xml = Resource.Config;

我不知道Visual Studio如何在内部处理.resx文件,但我怀疑它只是将资源复制到.resx文件中(在这种情况下,您最终会得到重复的资源).我假设它也没有在内部使用反射,所以为什么不在这样的情况下简单地使用.resx文件,这对我来说似乎更加性能友好?

Han*_*ant 4

但是使用反射来检索嵌入资源有什么好处

将数据从一种格式转换为另一种格式背后的共同好处。速度,速度,速度,方便。

XML 是一种相当不错的存储资源的格式。您将得到很好的保证,即 10 年后,当原始资源在时间的迷雾中丢失并且进行了几次机器更改时,您仍然可以检索原始资源,而无需进行任何更改。好的备份。但它是一种必须读取的相当糟糕的格式,XML 非常冗长,并且定位片段需要从文件的开头读取。

当 Resgen.exe 将 .xml 文件编译为 .resource 文件时,问题就会消失。适合链接到程序集元数据并包含资源中的原始字节的二进制格式。并且在加载程序集时直接映射到内存中,无需找到另一个文件并打开它、读取它并转换数据。巨大差距。

请使用资源设计器以避免直接使用 GetManifestResourceStream()。更方便。

  • 您似乎是根据“反思很慢”这一常见神话进行操作的。仅当您比较直接使用属性与使用反射获取属性值时,它才比较慢。当然,反射无法超越纳秒。与打开文件相比,GetManifestResourceStream“不”慢。它很容易就快了 50,000 倍,相差一个数量级:) (4认同)