埋め込みリソースの「パス」を見つけるにはどうすればよいですか?
質問
PNG をアセンブリ内の埋め込みリソースとして保存しています。同じアセンブリ内に次のようなコードがあります。
Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");
「file.png」という名前のファイルは (Visual Studio 内の) 「リソース」フォルダーに保存され、埋め込みリソースとしてマークされます。
コードは次のような例外を出して失敗します。
リソース MyNamespace.Resources.file.png がクラス MyNamespace.MyClass に見つかりません
動作する同一のコード(別のアセンブリに、別のリソースをロードしています)があります。だから私はそのテクニックが確かなものであることを知っています。私の問題は、正しいパスが何かを理解するのに多くの時間を費やしてしまうことです。単純にクエリできれば (例:デバッガーで) アセンブリで正しいパスを見つけると、頭痛の種が軽減されます。
解決
これにより、すべてのリソースの文字列配列が取得されます。
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
他のヒント
私も毎回これを行う方法を忘れてしまうので、必要な 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();
}
}
あなたのクラスは別の名前空間にあると思います。これを解決する標準的な方法は、リソース クラスと厳密に型指定されたリソースを使用することです。
ProjectNamespace.Properties.Resources.file
IDE のリソース マネージャーを使用してリソースを追加します。
次のメソッドを使用して埋め込みリソースを取得します。
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")
リソースの名前は、名前空間にファイルへのパスの「疑似」名前空間を加えたものです。「疑似」名前空間は、 の代わりに \ (バックスラッシュ) を使用したサブフォルダー構造によって作成されます。(ドット)。
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")
名前空間のフォルダー構造 resource\xml にある my.xml のストリームを返します。my.namespace。