2013-12-11 31 views
6

ここでは非常に単純なものがありますが、リフレクションを使用してを含む同じアセンブリから組み込みリソースを取得する利点は何ですか?単に.resxファイルを介してそれを取得する?私はこれをたくさん見ますが、それを取得しないでください - をresxファイルResources.resourceと比較する理由がありますか?マイクロソフトでさえそれはHow to embed and access resourcesです。埋め込みリソースにアクセスするためのリソースファイル(.resx)とリフレクション

正確にはどういう意味ですか:組み込みリソースConfig.xmlを含むアセンブリMyAssemblyがあるとします。

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

はなぜGetManifestResourceStream()ときに使用します。

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

は、多くの場合、私はリソースを取得するためにリフレクションを使用して、これはこのように実装を参照してください。アセンブリは、文字列として言ったリソースを返すメソッドを実装しMyClassを持っています次のことができます。

  1. は、Visual StudioでMyAssemblyプロジェクトにリソースファイル(Resource.resx)を追加します。
  2. Config.xmlをリソースの 'Files'に追加します。 string xml = Resource.Config;

が、私は内部のファイルを.resxファイルの処理方法Visual Studioのか分からないが、私は中に(それ単にコピーした.resxファイルにリソースを疑う:

  • は、はるかに簡単な方法でConfig.xmlのコンテンツを取得しますこの場合は、重複したリソースで終了します)。私はそれが内部的に反射を使用しないと仮定します。なぜなら、このような状況で単に.resxファイルを使用しないでください。

  • +1

    アセンブリーを介して取得することは、カルチャー認識衛星アセンブリの読み込みを行うことがありますが、resxを読み込むと、現在のカルチャに対して正しいものを選択する責任があります。 –

    答えて

    3

    が、どのような埋め込みリソース

    ある形式から別の形式にデータを変換する理由の背後に共通の利益を取得するためにリフレクションを使用する利点があります。スピード、スピード、スピード、利便性。

    XMLは、あなたのリソースを保存しておくためのかなりまともなフォーマットです。元のリソースを10年後に元のまま取得できるという非常に良い保証があります。適切なバックアップが取られていないマシンの変更。しかし、それは読まなければならない非常に厄介なフォーマットであり、XMLは非常に冗長であり、断片を見つけるにはファイルの先頭から読み込む必要があります。

    Resgen.exeが.xmlファイルを.resourceファイルにコンパイルすると消える問題。アセンブリメタデータにリンクするのに適しており、リソース内の元のバイトを含むバイナリ形式。また、アセンブリがロードされたときにメモリに直接マップされ、別のファイルを見つけて開く必要はなく、読み込んでデータを変換する必要はありません。大きな違い。

    リソースデザイナを使用すると、GetManifestResourceStream()を直接使用する必要がなくなります。さらに便利です。

    +0

    公正なポイント、ありがとう。ただし、直接リソースへのアクセスにリフレクションを使用することによるスピードの利点は、大量のリソースファイルを.resxに格納する場合にのみ明らかになります。あなたは 'GetManifestResourceStream'を必要とし、それを適切なフォーマットに変換する必要があるので).resxからの読み込みに比べて遅いですか? – w128

    +4

    「反射が遅い」という共通の神話から操作しているようです。プロパティー値を取得するためにReflectionを使用してプロパティを直接比較すると、遅くなります。確かに、反射でナノ秒を打つことはできません。 GetManifestResourceStreamは、ファイルを開くのに比べて遅くはありません。それは容易に50,000倍速く、与えるか、または大きさの桁を取る:) –