2012-03-04 8 views
9

私のリソースフォルダにexeが追加されているとします。今、どのように文字列としてリソースの名前(またはファイル名を持つことができるようにリンクされているフルパスさえ)を得ることができますか?リソースオブジェクトからリソース名を取得するにはどうすればよいですか?

投稿者Properties.Resources.myAppどうすればstring "myApp"を入手できますか? ToString()は動作しません。名前を取得するためにファイルを埋め込むことが重要な場合は、できます。

編集:私の質問は、特にexeリソースの名前を取得することではありません。しかし、それは私に資源の名前を与える1つの一般的なアプローチ!たとえば、自分のリソースがビットマップイメージの場合はどうなりますか? Properties.Resources.Lilyから "Lily"を印刷する必要があります。これを達成する方法は? ToStringはとにかく動作しません。

答えて

2

ことshoudこれは非常に古いですが、受け入れられた答えは私ですもはや必ずしも最善の答えです。 C#6.0の時点ではあなただけnameof(...)を使用することができます。

string resourceName = nameof(Properties.Resources.MyResourceName); 
// resourceName == "MyResourceName" 

はるかに簡単!

0

プロジェクトリソースにファイルを埋め込むと、プロジェクトをビルドするときに実行可能ファイルに埋め込まれ、プロジェクト実行ファイルとは別に存在するため、ハードドライブには存在しません。 ので、あなたのプロジェクトフォルダにこのMYAPP.EXEをしたい場合は、プロジェクトのフォルダに入れて、その後に行く

  • のVisual Studio >>
  • ソリューションエクスプローラ>>
  • ショーに左上隅にあるすべてのファイルをクリックしてください>>
  • MYAPP.EXEが見えるベンます>>
  • 右MYAPP.EXEクリックをクリックしてプロジェクトに含める>>
  • ヒットF4プロパティページが表示集束されるよう>>
  • "コピー常に"

enter image description hereenter image description here

に出力ディレクトリに210

  • セットをコピーしますMYAPP.EXE使用のパスをしたい場合:

    System.IO.Path.Combine(Application.StartupPath, "myApp.exe"); 
    

    更新あなたはすべきですハードコード "myApp"の定義に行くと:

    Properties.Resources.myApp 
    

    あなたが表示されます。

    internal static byte[] myApp { 
         get { 
          object obj = ResourceManager.GetObject("myApp", resourceCulture); 
          return ((byte[])(obj)); 
         } 
        } 
    

    をそれはハードコーディングされています!!!!

  • +0

    これは私の質問ではありません。私はexeを別個の項目として追加していませんが、私はそれをリソースに追加して、将来はそれを最終的に組み込むことができます。私の質問は、どのように私はすべてのプログラムで、リソースの項目から文字列名を取得します。実行時に "myApp"の名前は何ですか?私はちょうどハードコード "myapp.exe"を暗記しません – nawfal

    +0

    リソースを使用するとFULLPATHはありません。なぜなら、それはハードドライブではないから...とにかくあなたが何を望んでいるのか正確に説明することができます –

    +0

    私は、また、私はfullPathを必要とする必要はありません。ちょうどファイル名が行います。 – nawfal

    1

    アセンブリをご希望ですか?ここでは、ディレクトリから、あなたのすべてのexeファイルを-get's少しのコードスニペット:System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();

    foreach (string fileName in Directory.GetFiles("./Files")) 
    { 
        FileInfo fileInfo = new FileInfo(fileName); 
    
        if (fileInfo.Extension.Equals(".exe")) 
        { 
         Assembly pluginAssembly = Assembly.LoadFrom(fileName); 
    
         //... 
        } 
    } 
    
    +0

    これは回避策です。私が求めるものに対する解決策ではありません。私は私の質問を編集します。 – nawfal

    1

    あなたのプロジェクト内のすべてressourcesのリストを取得します。

    すべてのexeファイルを検索する場合は(次のスニペットを使用してアセンブリ名を取得します)

    var ressourceList = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); 
        var filename = ressourceList.Where(x => x.EndsWith(".exe")).FirstOrDefault(); 
    

    文字列の形式はこれだけ、その文字列の最初の部分を削除し、あなたが埋め込まれたressourceファイル名を持つ"YourProgram.YourAssemblyName.exe"です。

    編集:あなたのリソースを列挙し、先頭のネームスペースと末尾のファイル拡張子を削除してみませんか?

    // returns just the names 
        public static IEnumerable<String> GetEmbeddedResourceNames() 
         { 
          var returnList = new List<String>(); 
          foreach (var res in Assembly.GetExecutingAssembly().GetManifestResourceNames()) 
          { 
           var s = Assembly.GetExecutingAssembly().GetName(); 
           returnList.Add(Regex.Replace(res.Replace(s.Name + ".", ""), @"\.[^.]*$", "")); 
          } 
          return returnList; 
         } 
    

    編集:

    名前でressourceを取得するには、それはLINQの式を使用して、非常に簡単ですvar prop = Properties.Resources.ResourceManager.GetObject("YourRessourceNameWithoutExtension");

    +0

    これは回避策です。私が求めるものに対する解決策ではありません。私は私の質問を編集します。 – nawfal

    +0

    もう一度、これは近いが、リソース名のリストを与えるが、どのファイルがどのファイルに対応しているかを知る方法は?複数のexeファイルが埋め込まれているとどうなりますか?私の要件はC#2.0です。 – nawfal

    +0

    同じ名前の2つのリソースを持つことはできません(新しいものは古いものを置き換えます)。あなたが2つのexeファイルApp.exeとApp1.exeを持っているなら、あなたはプログラマーとして何とか使い方を決める必要がありますか? – Alex

    21

    を使用します。

    using System.Linq.Expressions; 
    //... 
    static string GetNameOf<T>(Expression<Func<T>> property) 
    { 
        return (property.Body as MemberExpression).Member.Name; 
    } 
    // Usage: 
    var s = GetNameOf(() => Properties.Resources.Lily); 
    

    sは、私が知っているLily

    +1

    もちろん、これはファイルの名前を返さないが、 'ResXFileCodeGenerator'を使った場合には生成されたプロパティの名前を返す。(他のソースから読み込むことはできない。生成された ' Designer.cs'はファイル名への参照さえも持たず、' .resx'ファイルも存在しません。コンパイル時にのみ、ruではなくntime。 – Jcl

    +0

    非常に良い。どのようにC#2だろう。これは0の実装ですか? – nawfal

    +1

    申し訳ありませんが、私はそのタグをスキップしました...もしあなたがLinqなしのパラメータとしてプロパティを渡すことができないので、おそらく使い方が簡単ではない、それは魔法の文字列を使って行う必要があります。その名前の文字列最善の策は、ResXFileCodeGeneratorを拡張し、リソースごとにいくつかの文字列プロパティを作成することです。これを開始する方法としては、[このコードプロジェクトの記事](http://www.codeproject.com/Articles/13830/Extended-Strongly-Typed-Resource-Generator)(下を見てください。すでにリソース名constとして)。 – Jcl

    関連する問題