2008-08-26 20 views
81

組み込みリソースとしてPNGをアセンブリに格納しています。同じアセンブリ内から私は、このようないくつかのコードをしている:「file.png」という名前のファイルには、「リソース」フォルダ(Visual Studioの内)に埋め込みリソースの「パス」を検出するにはどうすればよいですか?

Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png"); 

格納され、埋め込みリソースとしてマークされています。

コードが言って例外で失敗:リソースMyNamespace.Resources.file.pngクラスMyNamespace.MyClass

で見つけることができません

私は、別のアセンブリに(同じコードを持っています別のリソースを読み込みます)。だから私は技術が健全であることを知っています。私の問題は、正しいパスが何であるかを理解しようと多くの時間を費やしてしまうことです。正しいパスを見つけるためにアセンブリをクエリするだけで(例えば、デバッガで)、それは頭痛の負荷を節約します。

答えて

156

これは、あなたの文字列のすべてのリソースの配列を取得しますクラス:

public class Utility 
{ 
    /// <summary> 
    /// Takes the full name of a resource and loads it in to a stream. 
    /// </summary> 
    /// <param name="resourceName">Assuming an embedded resource is a file 
    /// called info.png and is located in a folder called Resources, it 
    /// will be compiled in to the assembly with this fully qualified 
    /// name: Full.Assembly.Name.Resources.info.png. That is the string 
    /// that you should pass to this method.</param> 
    /// <returns></returns> 
    public static Stream GetEmbeddedResourceStream(string resourceName) 
    { 
     return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); 
    } 

    /// <summary> 
    /// Get the list of all emdedded resources in the assembly. 
    /// </summary> 
    /// <returns>An array of fully qualified resource names</returns> 
    public static string[] GetEmbeddedResourceNames() 
    { 
     return Assembly.GetExecutingAssembly().GetManifestResourceNames(); 
    } 
} 
+0

かなり便利です!ありがとう! –

15

あなたのクラスが別の名前空間にあると思います。

ProjectNamespace.Properties.Resources.file 

は、リソースを追加するIDEのリソースマネージャを使用します。これを解決するための標準的な方法は、リソースクラスと強く型付けされたリソースを使用することです。私は自分自身が、私はちょうど私が少しで必要な2つのワンライナーを包み込むようにもこれを毎回行う方法を忘れて見つける

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); 
+0

あなたは正しいです、私のクラスは別の名前空間です。リソースフォルダは、プロジェクト構成のデフォルトの名前空間として指定された名前空間の下に存在しているようです。さまざまな理由から、このクラスが属する名前空間ではありません。 別のアプローチを完全に使用することについても正しいと思われますが、従来のコードと一貫している必要があるため、それは私がコントロールできません。 – Rob

+0

これは、ファイルパスではなく、リソースを取得します。 –

+0

@UchihaItachiだからこそ、私はこの答えを、そのままの形で回答しているのではなく、根底にある問題*を解決する別の(そして間違いなく標準的な)方法として明示的に提供したのです。 –

3

リソースの名前は、名前空間とファイルへのパスの "擬似"名前空間です。 "擬似"名前空間は、サブフォルダ構造の代わりに\(バックスラッシュ)を使用して作成されます。 (ドット)。

public static Stream GetResourceFileStream(String nameSpace, String filePath) 
{ 
    String pseduoName = filePath.Replace('\\', '.'); 
    Assembly assembly = Assembly.GetExecutingAssembly(); 
    return assembly.GetManifestResourceStream(nameSpace + "." + pseduoName); 
} 

次の呼び出し:

GetResourceFileStream("my.namespace", "resources\\xml\\my.xml") 

は、フォルダ構造のリソースに位置my.xmlのストリームを返します\名前空間内のxml:my.namespace。

+4

また、フォルダ内のダッシュ( ' - ')はアンダースコア( '_')に置き換えられます。他のシンボルもあるかもしれません。コンパイラがどのようにそれをやっているのか見てみたいので、同じメソッドを使うことができます。 –

5

私が埋め込まれたリソースをつかむために、次のメソッドを使用します。

protected static Stream GetResourceStream(string resourcePath) 
    { 
     Assembly assembly = Assembly.GetExecutingAssembly(); 
     List<string> resourceNames = new List<string>(assembly.GetManifestResourceNames()); 

     resourcePath = resourcePath.Replace(@"/", "."); 
     resourcePath = resourceNames.FirstOrDefault(r => r.Contains(resourcePath)); 

     if (resourcePath == null) 
      throw new FileNotFoundException("Resource not found"); 

     return assembly.GetManifestResourceStream(resourcePath); 
    } 

私は、プロジェクト内のパスでこれを呼び出す:

GetResourceStream(@"DirectoryPathInLibrary/Filename") 
関連する問題