118

アセンブリに埋め込みリソースとして PNG を保存しています。同じアセンブリ内から、次のようなコードがあります。

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

"file.png" という名前のファイルは "Resources" フォルダー (Visual Studio 内) に保存され、埋め込みリソースとしてマークされます。

コードは次のような例外で失敗します。

リソース MyNamespace.Resources.file.png がクラス MyNamespace.MyClass に見つかりません

動作する同一のコード(別のアセンブリで、別のリソースをロード)があります。だから私はテクニックが健全であることを知っています。私の問題は、正しいパスが何であるかを把握するために多くの時間を費やしてしまうことです。正しいパスを見つけるためにアセンブリを (たとえば、デバッガーで) 単純にクエリできれば、頭の痛い問題を解決できます。

4

5 に答える 5

210

これにより、すべてのリソースの文字列配列が取得されます。

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
于 2008-08-26T11:21:34.333 に答える
48

私も毎回これを行う方法を忘れていることに気付いたので、必要な 2 つのワンライナーを小さなクラスでラップするだけです。

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();
    }
}
于 2008-08-26T14:51:12.533 に答える
19

あなたのクラスは別の名前空間にあると思います。これを解決する標準的な方法は、リソース クラスと厳密に型指定されたリソースを使用することです。

ProjectNamespace.Properties.Resources.file

IDE のリソース マネージャを使用してリソースを追加します。

于 2008-08-26T11:17:38.617 に答える
8

次のメソッドを使用して、埋め込みリソースを取得します。

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");
于 2015-01-16T21:59:59.897 に答える