Как я могу обнаружить "путь" встроенного ресурса?
Я храню PNG как встроенный ресурс в сборке. Из той же сборки у меня есть такой код:
Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");
файл с именем " file.png "хранится в папке "ресурсы" (в Visual Studio) и помечается как внедренный ресурс.
код выдает исключение, говоря:
Resource MyNamespace.Ресурсы.файл.png не может быть найден в классе MyNamespace.MyClass
У меня есть идентичный код (в другой сборке, загрузка другого ресурса), который работает. Так что я знаю, что техника хорошая. Моя проблема в том, что я в конечном итоге тратят много времени, пытаясь выяснить, что правильный путь. Если бы я мог просто запросить (например. в отладчике) сборка, чтобы найти правильный путь, что бы сэкономить мне нагрузку головных болей.
5 ответов:
Это даст вам строковый массив всех ресурсов:
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
Я забываю, как это делать каждый раз, так что я просто обернуть два однострочных, что мне нужно в небольшом классе:
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(); } }
Я предполагаю, что ваш класс находится в другом пространстве имен. Канонический способ решить эту проблему - использовать класс resources и строго типизированный ресурс:
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")
вернет поток мой.xml находится в папке-структура resources\xml в пространстве имен: my.пространство имен.