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

时间:2013-12-11 13:50:00

标签: c# .net visual-studio reflection embedded-resource

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

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

public string GetConfigXML() // returns the content of Config.xml as a string

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

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

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

  1. 将资源文件(Resource.resx)添加到Visual Studio中的MyAssembly项目中;
  2. Config.xml添加到资源的'文件';
  3. 以更简单的方式获取Config.xml的内容:string xml = Resource.Config;
  4. 我不知道Visual Studio如何在内部处理.resx文件,但我怀疑它只是将资源复制到.resx文件中(在这种情况下,您最终会得到重复的资源)。我假设它也没有在内部使用反射,所以为什么不在这样的情况下简单地使用.resx文件,这对我来说似乎更友好?

1 个答案:

答案 0 :(得分:3)

  

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

将数据从一种格式转换为另一种格式的任何理由背后的共同利益。速度,速度,速度和便利性。

XML是一种相当不错的格式,可以保存您的资源。您将有一个非常好的保证,您可以在10年后检索原始资源,此时原始资源在时间的迷雾中丢失了几个机器更改没有良好的备份。但这是一个非常糟糕的格式,必须读取,XML非常冗长,定位片段需要从文件的开头读取。

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

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